Commit Graph
100 Commits
Author SHA1 Message Date
wangbo f33d6d64e0 fix(queue): 回收失效任务并阻止不确定提交重放
Worker 进程心跳不能证明单个 River job goroutine 仍存活,改以任务执行租约作为回收所有权栅栏。\n\n排队任务若上一次 attempt 在租约中断时处于 submitting 或 response_received,则转入人工复核并生成 release 记录,不再重新提交上游;明确被上游拒绝的响应仍允许重试。\n\n验证:go vet ./...;env -u AI_GATEWAY_TEST_DATABASE_URL go test ./... -count=1;真实 PostgreSQL 下相关 store 与 River 集成测试通过。
2026-07-30 19:15:19 +08:00
wangbo 9e06ed6162 fix(k3s): 让数据库探针访问节点本地 API
避免 kubernetes Service 在跨地域 API endpoint 间负载,导致 CNPG liveness/readiness 探针受 WireGuard 拥塞影响。\n\n通过 Downward API 将 KUBERNETES_SERVICE_HOST 设为 Pod 所在节点名,并使用本地 K3s 6443 端口。节点名解析、TLS 主机名校验和 kubectl 服务端 dry-run 均已通过。
2026-07-30 19:00:01 +08:00
wangbo e1e18dbe58 fix(k3s): 放宽数据库隔离探针容忍窗口
避免跨节点控制面短时拥塞导致主库被默认 30 秒 liveness 窗口误判并重启。\n\n保持隔离检查开启,将 livenessProbeTimeout 调整为 300 秒,并把隔离检查连接与请求超时调整为 5 秒。已通过线上 CRD 字段核验和 kubectl 服务端 dry-run。
2026-07-30 18:55:47 +08:00
wangbo 38f87b6970 fix(queue): 防止过期执行占位阻塞与重复提交
队列恢复后,仍在运行标记中的 River job 可能保留 waiting admission,形成全局 FIFO 队头阻塞;同时旧执行在租约被接管后仍可能创建 attempt 或切换到 submitting。

新增 stale admission 自动让出机制,并用当前 execution token 对 attempt 创建和上游提交状态切换做 fencing。任务、River job 和结算状态均不在让出流程中改写。

验证:go vet ./...;env -u AI_GATEWAY_TEST_DATABASE_URL go test ./... -count=1;真实 PostgreSQL 集成测试覆盖 stale admission 让出与旧 token 提交拦截。
2026-07-30 18:25:00 +08:00
wangbo fa818e9ebf fix(queue): 重新调度终态 River 任务
等待异步准入的任务只跳过仍处于活跃状态的 River Job;missing 或 terminal Job 交由准入调度器重新创建,避免非空 river_job_id 永久阻断旧任务。\n\n通用 River 恢复排除等待准入任务,消除双恢复循环与误导日志;事务回滚继续使用独立有界上下文。\n\n验证:真实 PostgreSQL 下异步 Worker 准入验收和跨 Store 队列集成测试均通过。
2026-07-30 17:42:33 +08:00
wangbo e8893e2b8f chore(release): 重新生成可回滚发布基线
当前 K3s 工作负载已核验并登记为 3aa78d3e5c0ba83227aaf33849c098405a89ceb5。\n\n使用新的不可变 SHA 重新生成 release manifest,避免覆盖已推送镜像 Tag,并恢复部署前后的自动回滚链。
2026-07-30 17:32:18 +08:00
wangbo 6bab0f0749 fix(worker): 防止事务泄漏并恢复滞留队列
为 PostgreSQL 连接增加可配置的事务空闲与锁等待超时,并在请求取消或 Worker 退出后使用独立有界上下文回滚事务。\n\n恢复过期任务时按批次使用 SKIP LOCKED,周期重建缺失或终态 River Job;锁等待超时只在确认尚未提交上游时安全重排,避免重复执行和重复结算。\n\n验证:完整 Go 测试、go vet、生产 Kustomize 渲染、gofmt 与 git diff --check 均通过。
2026-07-30 17:27:11 +08:00
wangbo bc44af751e fix(worker): 为容量扩展预留数据库连接
原因:单实例执行容量提升到 24 后,Worker 的 24 条数据库连接会被执行任务全部占用,导致心跳、选主、健康检查和并发租约续期超时。

影响:生产 Worker 连接池提高到 32,在 24 个执行槽之外保留 8 条控制连接;PostgreSQL max_connections=200,两实例与 API 的理论连接总量仍在安全范围内。

验证:kubectl kustomize deploy/kubernetes/production、git diff --check 通过;线上两地 Worker 按 32 条连接滚动后连续 3 分钟 Ready、0 重启、0 数据库控制错误、0 租约丢失。
2026-07-30 16:17:16 +08:00
wangbo 3aa78d3e5c perf(worker): 按实例内存上限扩展异步容量
将策略推导出的集群目标与单 Worker 内存安全上限分离,避免失活实例的全部容量转移到单个 2 GiB Pod。

生产环境单实例上限和媒体物化并发设为 24;两实例正常时总容量由 16 提升至 48,后续可通过增加 Worker 节点继续扩展。新增 0093 迁移保存实例容量上限,并兼容滚动发布中的旧实例。

风险:更高媒体并发会增加 Worker 和节点内存压力,保留单实例 24 的硬边界并由持续监控观察 RSS、OOM、队列与节点余量。

验证:go test ./... -count=1;go vet ./...;真实 PostgreSQL 分配与故障转移测试;迁移安全检查;kubectl kustomize;gofmt -l;git diff --check。
2026-07-30 15:08:54 +08:00
wangbo ea58d21d03 perf(queue): 限制大媒体任务内存并消除准入惊群
将同步与异步非文本任务的准入唤醒改为按任务和全局队首推进,批量续租等待者,避免大量请求同时争抢 advisory lock 和数据库连接。

对 Base64 请求解析、素材解码、上游媒体执行和结果物化增加分层并发限制,复用请求素材并释放重复 Gemini wire 数据;生产 API 默认入口解析并发 16,媒体物化并发 8。

新增 1000 个同步 Gemini 图像编辑请求的模拟上游压力验收,10 MiB 输入和输出下全部成功,Heap 峰值增长约 2.58 GiB,并验证共享上传哈希、单次 attempt 与本地零落盘。

验证:go test ./... -count=1;go vet ./...;gofmt -l 无输出;kubectl kustomize deploy/kubernetes/production;10 MiB Gemini Base64 千任务压力测试通过。
2026-07-30 13:13:32 +08:00
wangbo fd3b6bf042 fix(worker): 增强队列启动与租约到期恢复
River 初始化遇到瞬时数据库超时时最多重试三次,并确保启动异常时先取消后台 LISTEN 和 Worker 上下文再关闭连接池,避免不就绪 Pod 卡在退出路径。Worker 维护循环每 15 秒执行幂等运行时恢复,使旧实例中断任务在执行租约到期后自动重排并继续触发孤儿 Job 救援。验证通过完整 Go 测试、go vet、竞态检查和迁移安全检查。
2026-07-29 23:55:49 +08:00
wangbo f3dd7cd262 fix(queue): 自动救援失活 Worker 遗留任务
新增基于任务状态、执行租约和 Worker 心跳的孤儿 River Job 精确识别,每 15 秒将确认失活的 Job 恢复为可重试,避免等待 River 一小时通用救援窗口。运行时恢复同步清除中断及终态任务的 admission、执行令牌和并发租约,防止状态残留污染队列指标。正常运行中的长任务仍由 running 状态和活跃心跳保护。验证通过完整 Go 测试、go vet、竞态检查、迁移安全检查和 PostgreSQL 18 集成测试。
2026-07-29 23:44:29 +08:00
wangbo 98820378b7 perf(store): 消除同步复制下的鉴权与心跳锁阻塞
将 Worker 心跳与容量分配事务设为本地异步提交,避免同步副本延迟期间长期持有全局分配锁。API Key 使用时间改为异步提交并按分钟合并,消除高并发请求对同一热行的锁排队。业务任务、钱包、结算、并发租约等关键数据仍保持同步复制。验证通过完整 Go 测试、go vet、竞态测试、迁移安全检查及 PostgreSQL 18 集成测试。
2026-07-29 23:25:54 +08:00
wangbo 91451b3c86 fix(cluster): 修复身份事务阻塞与 Worker 容量抖动
将身份协调和安全事件心跳改为 PostgreSQL 单 Leader 执行,并从独立 Worker 进程中移除身份运行时,避免多副本重复写同一状态。

为安全事件事务增加锁等待、空闲事务超时及独立回滚上下文;Worker 需连续丢失六次心跳后才判定失效,降低跨节点抖动导致的容量反复扩缩。

验证:Go 全量测试、go vet、Race 聚焦测试、PostgreSQL 18 Leader/安全事件/Worker 分配集成测试及迁移测试通过。
2026-07-29 23:04:41 +08:00
wangbo 3886048e0f fix(gemini): 移除空返图占位并暴露失败原因
Gemini 图片响应未包含可提取资源时,不再返回伪造占位图,改为非重试失败并保留安全拦截、候选结束状态和上游错误等结构化诊断。\n\n同步将诊断写入 HTTP 错误、任务结果、attempt 指标和日志,确保任务失败时不结算,并补充单元及 PostgreSQL 验收测试。\n\n验证:gofmt、go test ./... -count=1、go vet ./...、迁移安全检查、pnpm openapi。
2026-07-29 19:50:43 +08:00
wangbo 012823adff fix(cluster): 保护 API 持久队列恢复启动阶段
API 角色启动时同样会恢复持久队列状态,积压较多时可能超过 liveness 初始窗口并被误杀。为两地 API 增加最长 10 分钟 startupProbe,旧 Pod 在新 Pod Ready 前继续服务。\n\n验证:kubectl kustomize、服务端 dry-run、生产滚动更新。
2026-07-29 19:18:42 +08:00
wangbo d810881901 fix(cluster): 修正 server-main 内网端口
生产 easyai-server 实际监听 3001,原 K3s 配置指向 3000 导致内部调用和任务进度回调 connection refused。将 SERVER_MAIN_BASE_URL 与回调地址修正为 WireGuard 内网 3001。\n\n当前 server-main v3.8.3 尚未实现任务进度回调路由,后续仍需 backend 配套并重放回调。验证:两节点访问 3001、kubectl kustomize、服务端 dry-run。
2026-07-29 19:12:27 +08:00
wangbo 4371e57212 fix(cluster): 进一步收紧媒体 Worker 并发上限
全局 48 槽在持续观察中仍导致宁波 Worker OOM。按实测内存占用将生产全局异步执行上限降至 16,双节点各 8 槽,单节点接管最多 16 槽;高并发请求继续由持久队列吸收。\n\n未开启 queue_size 生产策略。验证:kubectl kustomize、服务端 dry-run。
2026-07-29 18:51:26 +08:00
wangbo 8ce1f857a4 fix(cluster): 延长 Worker 启动探针保护期
Worker 在切换后恢复积压 River 任务时可能超过原 liveness 初始窗口,导致健康端口尚未监听就被误杀。增加最长 10 分钟 startupProbe,启动完成后仍沿用原 readiness 和 liveness。\n\n验证:kubectl kustomize、服务端 dry-run、生产滚动更新。
2026-07-29 17:49:13 +08:00
wangbo ba01cbef53 fix(cluster): 限制生产异步 Worker 执行容量
切换后集中恢复积压时,单 Worker 155 槽导致数据库连接池 24/24 饱和并触发香港 Pod OOM。将集群异步执行硬上限暂定为 48,使双 Worker 正常时各分配 24 槽,与每 Pod 连接池上限对齐。\n\n未开启任何 queue_size 生产策略。验证:kubectl kustomize、服务端 dry-run。
2026-07-29 17:45:23 +08:00
wangbo 4eb394bfbd test(cluster): 支持固定成功候选执行文件验收
为跨节点真实文件验收增加可选平台模型筛选,避免同名模型的失效候选掩盖共享文件链路结果。\n\n验证:真实任务 7888708e-a870-4676-bdfc-4021853365a7 由香港 Worker 执行,输入与生成结果在两节点下载的长度和 SHA-256 一致;单 attempt、结算、扣费及回调去重断言通过。
2026-07-29 17:43:34 +08:00
wangbo de1ce2274b fix(cluster): 等待 Worker 完全退出后执行跨节点验收
修正缩容期间 Deployment 已显示零就绪但旧 Worker Pod 尚在退出时仍可能领取验收任务的竞态。真实任务提交前现在会确认宁波 Worker Pod 数量为零,并在失败路径尝试取消未完成的测试任务。\n\n验证:node --check、bash -n、ShellCheck、git diff --check。
2026-07-29 17:29:15 +08:00
wangbo a073c840ac fix(cluster): 兼容 Worker 缩容后的空就绪状态
Kubernetes 在 Deployment 缩容为 0 后可能省略 status.readyReplicas;验收脚本将空值按 0 处理,避免在提交真实任务前误判失败。
2026-07-29 17:05:59 +08:00
wangbo 39b1541fa1 build(migrations): 固化 OIDC 迁移安全复核
为已进入主干且会重建约束的 OIDC 迁移增加 SHA-256 锁定的精确规则豁免,文件内容或违规类型变化时仍会拒绝发布。

生产只读预检确认受影响表规模很小,现有 6 条身份配置均为 schema v1,OIDC 会话和撤销水位均为空;新增校验器测试覆盖允许项和校验和篡改。
2026-07-29 16:19:00 +08:00
wangbo 9e4fc7362d feat(queue): 增加非文本模型分布式准入队列
使用 PostgreSQL 统一同步与异步非文本任务的并发准入、持久化等待和 Worker 容量分配,并将生产 API 与独立 Worker 角色拆分。

补充策略管理、共享契约、OpenAPI、Kubernetes 双节点 Worker 清单及跨节点验收脚本;未默认启用任何生产 queue_size 策略。

已在原基线完成 Go、前端、迁移、Shell、Kustomize 与长任务容量验收;合入最新主干后将重新执行发布门禁。
2026-07-29 16:15:43 +08:00
wangbo 135fb3d5b8 fix(deploy): 延长数据库副本重同步门限
CNPG 主库在 5 秒内晋升,但跨地域 pg_rewind 需要重传约 1.27GB,原 6 分钟等待不足。将同步副本恢复等待扩展到 30 分钟,并增加退出时清理写入探针的保护。\n\n已通过 bash -n、ShellCheck 和 git diff --check。
2026-07-29 03:46:16 +08:00
wangbo ea33be5d69 fix(deploy): 强化跨节点真实任务验收门禁
修正宁波旧 Worker 在滚动退场期间仍可能领取任务的竞态,提交任务前要求仅保留唯一且明确禁用 Worker 的新 Pod。\n\n为临时验收 Key 分配 gpt-image-2 所需的最小平台访问资源,并让 multipart 参数对齐线上 2K 图像编辑请求。已通过 bash -n、ShellCheck、node --check,并完成真实跨节点任务验收。
2026-07-29 03:24:02 +08:00
wangbo a642f43cf2 fix(deploy): 校准跨节点图片验收请求
真实成功样本使用 2048x2048,验收脚本改用相同默认尺寸并允许环境覆盖。修正创建 API Key 响应中的 apiKey.id 读取,每次运行前清理本脚本遗留 Key,结束时删除新 Key。\n\n验证:bash -n、ShellCheck、node --check、git diff --check。
2026-07-29 03:13:01 +08:00
wangbo 5d5284e068 test(api): 显式启用异步执行验收 Worker
动态并发验收直接构造 Config 时需显式开启 AsyncQueueWorkerEnabled,避免零值 false 把该测试误变为仅入队模式。\n\n验证:gofmt、go test ./internal/httpapi -count=1。
2026-07-29 03:07:13 +08:00
wangbo 9a3cc582ce fix(api): 分离异步队列入队与执行开关
AI_GATEWAY_ASYNC_QUEUE_WORKER_ENABLED=false 时仍初始化 River schema 与控制客户端,允许 HTTP 请求持久化并入队;仅跳过执行客户端和动态容量 Worker。关闭上下文时同步清理控制客户端引用。\n\n新增数据库集成测试覆盖无执行 Worker 时成功创建 River job 且 attempted_by 为空。验证:gofmt、go test ./... -count=1、go vet ./...。
2026-07-29 03:03:14 +08:00
wangbo 0bef13fbd7 fix(deploy): 完整读取边缘验收响应
OpenAPI 响应较大,curl 通过管道交给 grep -q 时会因下游提前退出报写端关闭,造成健康服务被误判失败。改为完整读取各响应后再断言内容。\n\n验证:bash -n、ShellCheck、git diff --check。
2026-07-29 02:56:50 +08:00
wangbo 6897fb3b66 fix(deploy): 使用站点专属 NodePort
HostPort 被命名空间 PodSecurity baseline 拒绝,因此恢复无特权 Pod 配置,并为宁波、香港的 API/Web 增加只选择本站 Pod 的专属 NodePort Service。双 NGINX 和验收脚本按站点使用 31088/31089 与 31178/31179,避免主机本地访问共享 NodePort 时随机命中不可达的跨站 Pod。\n\n验证:kubectl kustomize、服务端 dry-run、bash -n、ShellCheck、无 hostPort/hostIP、git diff --check。
2026-07-29 02:40:57 +08:00
wangbo 006609569d fix(deploy): 稳定边缘到站点的固定入口
主机本地访问跨站点 NodePort 时 kube-proxy 会随机选择不可达的对端 Pod,导致约四分之一请求被拒绝。为两地应用绑定仅位于 WireGuard 地址的 HostPort 31088/31178,双 NGINX 和集群验收改用该固定入口;原 NodePort 30088/30178 继续保留。端口处于现有公网 DROP、wg0 私网放行范围。\n\n验证:kubectl kustomize、服务端 dry-run、bash -n、ShellCheck、Secret 与 digest 静态检查、git diff --check。
2026-07-29 02:36:29 +08:00
wangbo 8e387ca553 fix(deploy): 固定 API 容器运行身份
API 镜像使用名称用户 appuser,Kubelet 无法仅凭 runAsNonRoot 验证其非 root 身份,导致 CreateContainerConfigError。按照 Dockerfile 中固定 UID 10001 显式设置 runAsUser、runAsGroup 和 fsGroup,确保 EmptyDir 可写且满足 Pod 安全约束。\n\n验证:kubectl kustomize 渲染成功,两个 API Deployment 均包含 UID/GID 10001,git diff --check 通过。
2026-07-29 02:28:19 +08:00
wangbo 39a8fd2ce0 fix(deploy): 移除激活阶段外网依赖
正式激活时不再从 GitHub 下载并重装已健康运行的 cert-manager、CloudNativePG 和 Barman Operator;Operator 安装继续保留在 prepare 阶段。激活阶段只渲染、校验并启动已锁定 digest 的应用清单,避免维护窗口受外网波动影响。\n\n验证:bash -n、ShellCheck、git diff --check。
2026-07-29 02:25:43 +08:00
wangbo f12f352bf0 fix(deploy): 规范化数据库版本对比
PostgreSQL 官方与 CNPG 镜像的 server_version 展示字符串包含不同构建后缀,造成同为 18.4 的数据库被误判不一致。改用 server_version_num 进行精确版本校验。\n\n验证:旧 Docker 与已恢复 CNPG 的完整验收快照 diff 无差异,server_version_num 均为 180004。
2026-07-29 02:17:13 +08:00
wangbo 945fc83c60 fix(deploy): 修正切换快照目录表名
切换前验收快照误用了不存在的 gateway_providers,导致在数据库导出前触发安全回滚。改为实际的 model_catalog_providers。\n\n验证:完整快照 SQL 已对线上旧库只读执行,版本、扩展、表、序列和关键计数均成功生成。
2026-07-29 02:11:48 +08:00
wangbo 5d2796337b fix(deploy): 等待维护入口完成重载
NGINX 优雅重载期间旧 worker 可能短暂继续返回 200,单次状态码断言会误触发安全回滚。改为最多轮询 15 秒等待维护页返回 503。\n\n验证:bash -n、ShellCheck、git diff --check、真实维护页 503 与恢复后公网 200。
2026-07-29 02:09:45 +08:00
wangbo b7c03d348e fix(deploy): 适配宁波 NGINX 配置加载路径
宁波 NGINX 仅加载 conf.d/*.conf,原切换脚本写入 sites-enabled 后不会生效。统一将维护页、集群入口和回滚配置写入实际加载的 conf.d 入口,并保留切换前配置备份。\n\n验证:bash -n、ShellCheck、git diff --check、双节点 nginx -t 与 prepare。
2026-07-29 02:06:12 +08:00
wangbo 74cf0ed5c8 fix(deploy): 避免验收入口端口冲突
将宁波跨节点验收私有入口从被 staging Docker 占用的 18088 调整为 18089,避免 NGINX reload 在切换前失败。同步更新真实文件任务验收脚本默认地址。已通过 node --check、bash -n、ShellCheck 和 git diff --check。
2026-07-29 02:02:42 +08:00
wangbo 7c142f5960 fix(deploy): 补齐集群备份兼容与切换前门禁
阿里云 OSS 的 S3 兼容层要求 virtual-hosted addressing,且 boto3 需要使用 Signature V2。本提交为 Barman 的归档、备份、保留与恢复统一挂载 AWS 配置,并将实际 WAL 归档和近期全备设为切换硬门禁。

同时补充 CNPG/etcdutl 固定版本安装、显式主库切换、三节点逐台停机、OSS 快照下载校验与远端临时 Secret 清理。已通过 ShellCheck、Kustomize、服务端 dry-run、迁移测试、发布脚本测试、敏感信息扫描及生产 precutover 验收。
2026-07-28 06:46:09 +08:00
wangbo f5b6ff72f2 fix(deploy): 无损传输证书同步 SSH 公钥
将包含空格与注释的 Ed25519 host key、公钥先 Base64 编码为单个 SSH 参数,远端解码后再次校验,并清理前次失败产生的无效 authorized_keys 单词行。

验证:Base64 完整往返、bash -n、ShellCheck,两次首次连接失败现场。
2026-07-28 05:53:43 +08:00
wangbo 5d8ed1f293 fix(deploy): 固定证书同步的香港 SSH Host Key
通过已认证的香港管理连接读取 Ed25519 host 公钥,将 WireGuard 地址 10.77.0.2 的精确键写入宁波 known_hosts,再执行证书同步;不关闭 StrictHostKeyChecking。

验证:远端 host key 格式解析、bash -n、ShellCheck,首次同步因缺少 known_hosts 的现场复现。
2026-07-28 05:53:00 +08:00
wangbo 1c0c298267 fix(deploy): 放宽数据库 Operator 首次拉取超时
CNPG 与 Barman Cloud 的固定镜像经跨境 mirror 首次拉取可能超过 180 秒,将 rollout 门限提升到 600 秒;cert-manager 保持原 180 秒快速门禁。

验证:CNPG 已实际 Ready,Barman 证书与插件注册正常且事件显示仅处于镜像拉取。
2026-07-28 05:17:25 +08:00
wangbo 6d7b2e88ba fix(deploy): 递归验证 containerd Registry 主机配置
K3s 1.36 将 Registry 镜像端点生成在 containerd/certs.d 子目录;验收改为递归检查整个 containerd 配置树,并继续以实际拉取 pause 镜像作为最终门禁。

验证:洛杉矶节点 Ready,三个 hosts.toml 端点存在,pause 镜像拉取成功。
2026-07-28 05:07:23 +08:00
wangbo 95ddfb2a04 fix(deploy): 为 K3s 配置容器镜像端点
三节点 containerd 增加 Docker Hub、GHCR 与 Quay 的 DaoCloud 镜像端点,解决生产节点直连公共 Registry 超时导致 Pod sandbox 无法创建的问题。

新增逐节点滚动刷新脚本,每次等待节点重新 Ready 并实际拉取 pause 镜像后才继续,避免同时重启 etcd 成员。初始 K3s 安装也会预置同一 registries.yaml。

验证:三节点镜像端点均返回 Registry 认证响应,bash -n、ShellCheck。
2026-07-28 05:05:33 +08:00
wangbo 44915c1343 fix(deploy): 使用 Server-Side Apply 安装大型 CRD
cert-manager、CloudNativePG 与 Barman 清单改用 server-side apply,避免 CNPG CRD 的 last-applied annotation 超过 Kubernetes 256KiB 限制;force-conflicts 仅用于已固定 checksum 的 operator 清单。

验证:cert-manager 组件已实际滚动成功,CNPG 客户端 apply 在 annotation 门禁处复现。
2026-07-28 05:00:52 +08:00
wangbo 19ce2d4272 fix(deploy): 保留 Kustomize digest 行缩进
替换真实 release manifest 的 API/Web digest 时固定输出 Kustomization 所需的四空格缩进,避免 awk 字段重建破坏 YAML。

验证:使用已发布 971540a 完整 manifest 实际渲染 696 行清单,确认所有应用镜像均为非零 digest。
2026-07-28 04:59:43 +08:00
wangbo d342462a3d fix(deploy): 兼容 macOS Bash 3.2 下载平台清单
将 operator URL 与固定 SHA-256 从关联数组改为并行索引数组,避免 macOS Bash 3.2 将带连字符的文件名解析为算术变量。远端资源复制前仍逐项校验 checksum。

验证:bash -n、ShellCheck、Bash 3.2 索引遍历。
2026-07-28 04:59:04 +08:00
wangbo 4e60bf1c64 fix(deploy): 本地校验并分发固定 K3s 二进制
生产节点访问 GitHub Release 失败时,改由本机下载 v1.36.2+k3s1 amd64 二进制,使用固定官方 SHA-256 校验后分发到三节点,再让官方安装器跳过远端下载。

同时将运行手册顺序改为先完成公网端口隔离,再安装 K3s。

验证:bash -n、ShellCheck、官方 checksum 获取与节点失败现场。
2026-07-28 04:50:54 +08:00
wangbo 85e14f2cb8 fix(deploy): 过滤 WireGuard 安装阶段标准输出
节点首次安装 wireguard-tools 时 apt 输出会混入公钥命令替换,导致格式门禁误判并安全停止。仅取远端输出最后一行作为公钥,同时保留原有长度和字符校验。

验证:bash -n、ShellCheck、远端公钥长度与权限只读检查。
2026-07-28 04:40:26 +08:00
wangbo 971540a2a4 feat(deploy): 增加三节点 K3s 高可用迁移能力
新增 WireGuard 全互联、三 server embedded-etcd K3s、CloudNativePG 双实例、Barman OSS 备份、双 NGINX、Kubernetes Secret/RBAC 与本地旧文件按严格 24 小时清理。

新增维护窗口数据迁移、digest 固定滚动发布、应用回滚、跨节点文件 E2E、节点和数据库故障演练、CNPG 恢复与 etcd 快照验收脚本;洛杉矶仅作为带 NoSchedule 污点的仲裁节点。

所有生产 Secret 只在执行时从 0600 本地环境和旧生产容器导入,仓库不保存凭据;公网入口保持人工 DNS 故障切换边界。

验证:bash -n、ShellCheck、kubectl kustomize、Node 语法检查、Secret 扫描、OSS put/head/delete 实测。
2026-07-28 04:37:31 +08:00
wangbo edf7e66941 feat(cluster): 增加跨节点任务执行与请求素材场景
新增 AI_GATEWAY_ASYNC_QUEUE_WORKER_ENABLED,默认保持启用;关闭时仅停止 River 异步任务执行器,HTTP、健康检查、结算与其他后台任务继续运行。

新增 0089 迁移并同步管理端默认场景,将 request_asset 加入现有上传渠道,确保 multipart 请求素材先转换为跨节点共享 URL。

验证:gofmt、go test ./... -count=1、go vet ./...、pnpm lint、pnpm test、pnpm build、迁移测试。
2026-07-28 04:36:58 +08:00
wangbo 2c7f8c14eb chore(release): 明确生产发布授权并支持集群发布
将发布与上线授权边界调整为一次明确的生产发布指令可连续执行 publish 和 deploy,同时保留仅构建镜像时的停止边界。

为现有发布脚本增加 compose/kubernetes helper 选择和显式 SSH 私钥支持,保持完整 SHA、digest 与生产基线校验不变。

验证:bash -n、ShellCheck、manual-release-test。
2026-07-28 04:36:53 +08:00
wangbo 31565af07a refactor(runner): 收敛上游失败决策与轮转策略
将同平台重试、跨平台动作、健康副作用和冷却排队统一到单一失败决策,避免旧降级策略与 failover 重复执行。\n\n增加事务级单源保护、候选实时刷新、冷却错误契约、管理接口严格校验及兼容策略只读展示。\n\n验证:真实 Gateway HTTP/PostgreSQL 接受测试 10 项通过;go test ./...、pnpm openapi、pnpm lint、pnpm test、pnpm build 均通过。
2026-07-27 23:50:17 +08:00
wangbo 046c16fc69 fix(audio): 兼容百炼 OpenAI 音频输入
为阿里云百炼 OpenAI-compatible Chat 统一保留标准 input_audio,并将旧版 audio_url 转换为 input_audio,同时根据 MIME 或扩展名补齐音频格式。

补充请求资产水合测试,确认 input_audio.data 会转换为裸 Base64 且保留 format。

验证:在 apps/api 执行 env -u AI_GATEWAY_TEST_DATABASE_URL go test ./... -count=1 全部通过。
2026-07-27 23:50:17 +08:00
wangbo 95776c84f6 fix(media): 规范比例与 OpenAI 图像尺寸参数
统一过滤非 x:x 比例,避免默认值参与候选匹配或透传上游。

支持 xK 分辨率归一化,并按 Gemini、Volces 和 OpenAI 的参数规范生成上游请求;OpenAI 显式 WxH 始终保留用户原始尺寸。

验证:在独立临时 worktree 中执行 apps/api 全量 go test ./... -count=1 通过,真实 OpenAI 请求已到达上游但受本地无效凭据阻断。
2026-07-27 23:50:17 +08:00
wangbo 039220c835 feat(models): 注册 Kimi K3 和 Qwen3.8 2026-07-27 23:50:17 +08:00
wangbo de10875439 feat(admin): 优化后台运维与任务管理
完善平台、基准模型、定价规则和实时负载的紧凑查询与滚动展示,并固定关键操作列。

新增管理员任务记录、批量计费结算和用户组限流、额度及模型权限维护能力,同时补充任务脱敏、查询索引与 OpenAPI 契约。

验证:pnpm openapi、Go 全量测试、pnpm lint、pnpm test、pnpm build、gofmt 与差异格式检查均通过。
2026-07-25 01:32:49 +08:00
wangbo b29d539d49 feat(database): 优化开发环境数据库连接配置逻辑
- 添加 database_url_targets_local_port 函数验证数据库URL端口匹配
- 新增 database_url_matches_container 变量标识数据库URL与容器匹配状态
- 更新 postgres_port 变量获取容器实际端口值
- 重构数据库URL配置条件判断逻辑
- 添加容器凭证刷新提示信息
- 优化Docker数据库创建条件判断流程
2026-07-24 23:54:31 +08:00
wangbo 152885bbb6 fix(routing): 对齐缓存亲和力硬规则与审计 2026-07-24 23:51:27 +08:00
wangbo a2ed32447a fix(storage): 补齐嵌套结果二进制转存
生产真实 Gemini 图片任务可能在标准 data 之外保留嵌套 Base64,导致最终持久化关口拒绝任务成功。\n\n在所有生成结果返回前统一执行递归转存,并对仍未被常规媒体转换识别的二进制回退到本地结果物化,确保 PostgreSQL 不接收原始二进制。\n\n验证:go test ./... -count=1;go vet ./...;使用生产 Gemini Flash Image 平台配置完成本地真实图片编辑请求,文件哈希一致且持久化结果无内联二进制。
2026-07-24 21:57:52 +08:00
wangbo 4f163ea6d7 perf(storage): 拦截任务二进制并本地暂存结果
原因:任务标准结果中的 Base64、Data URI 和 Buffer 会进入 PostgreSQL JSON,导致 TOAST 与备份体积快速增长。

影响:新增统一 JSON 持久化关口;upload_none 将二进制原子写入本地结果目录,数据库仅保存带 SHA-256 的有界占位符;任务详情、同步响应、异步查询和兼容协议按需校验恢复。补充 24 小时清理、容量上限、历史小批量治理命令及管理端说明。

风险:本地结果超过 TTL、丢失或损坏时分别返回明确的 410/500;空间不足时返回 503 且不重试上游。未自动执行历史治理。

验证:三种真实图片模型同步/异步与幂等重放通过;Go vet/全量测试、前端 111 测试、lint/typecheck/build、OpenAPI、迁移安全、govulncheck、依赖审计、手工发布测试及 Linux amd64 构建通过。
2026-07-24 21:13:09 +08:00
wangbo 2457de6a56 chore(release): 重新生成生产发布基线
首次发布时当前会话未加载生产 SSH 身份,导致 release manifest 无法记录现网基线。创建空提交生成新的不可变镜像 Tag,并在读取真实生产 release 后重新执行完整发布门禁;不包含源码变化。
2026-07-24 18:35:33 +08:00
wangbo 810dcfeee6 perf(storage): 极简化任务历史并增加保留治理
停止持久化 provider 原始响应、兼容响应快照、attempt/event/outbox 重复 JSON,并由标准任务结果动态生成 Kling/Keling/Volces 兼容响应。

增加事件去重与预算、极简 callback 投递、7/30 天分批清理、安全删除条件、并发迁移索引及可实际恢复的任务域排除备份。历史清理默认关闭,待兼容协议和异步恢复在线验证后单独启用。

验证:Go 全量测试与 go vet、PostgreSQL 18 集成与实际备份恢复、迁移安全测试、bash -n、ShellCheck、Compose 配置和人工发布脚本测试均通过。
2026-07-24 18:23:22 +08:00
wangbo 09375bfae7 fix(queue): 移除未配置的 GPT 图像并发上限 2026-07-24 17:03:28 +08:00
wangbo 20945dbbcb fix(runner): 延长媒体上游请求超时
图像生成上游同步响应可能超过 120 秒,原共享 HTTP 客户端会把仍在处理的提交标记为结果不确定。将客户端超时调整为 10 分钟,并增加回归测试;任务执行仍由现有租约、任务超时和取消机制约束。\n\n验证:\n- env -u AI_GATEWAY_TEST_DATABASE_URL go test ./internal/runner -run 'TestProviderHTTPClientTimeoutAllowsLongRunningMediaRequests|TestPlatformProxyMode' -count=1\n- env -u AI_GATEWAY_TEST_DATABASE_URL go test ./... -count=1
2026-07-24 13:42:47 +08:00
wangbo 6c5daf29ca perf(queue): 按策略动态扩缩异步 Worker
将 River 执行容量按平台模型与用户组的有效并发策略动态调整,并为长任务续租、并发租约原子抢占和限流退避补充保护。\n\n统一平台模型限流继承语义,兼容历史 platformLimits/modelLimits,并为三个迁移图像模型建立独立并发租约。补充管理端显式继承/覆盖配置、指标、单元测试及隔离 PostgreSQL 验收。\n\n验证:go test ./... -count=1;pnpm lint;pnpm test;pnpm build;隔离 PostgreSQL 并发原子性/续租测试;128 任务与三分钟长任务动态 Worker 验收。
2026-07-24 12:26:56 +08:00
wangbo 290b8c1854 fix(queue): 扩展生产媒体任务吞吐 2026-07-24 10:37:20 +08:00
wangbo d80b2e5ebf fix(queue): 提升媒体任务执行并发 2026-07-24 10:31:18 +08:00
wangbo 36d1b18e10 fix(images): 规范 OpenAI 图像尺寸参数 2026-07-24 09:28:18 +08:00
wangbo 8df87875de fix(images): 优先转换编辑图片为 multipart 二进制
OpenAI 编辑即使声明支持 URL,也必须在 multipart 提交前转存为二进制文件。
2026-07-24 09:04:23 +08:00
wangbo db640c1211 fix(images): 兼容 OpenAI 多图编辑 multipart
- 将 OpenAI images/edits 请求构造成 multipart/form-data
- 在运行时安全转存 URL 图片为 data URL 后提交二进制文件
- 覆盖多图字段、真实上游模型名和内部元数据过滤测试
2026-07-24 08:59:42 +08:00
wangbo 1da712854f fix(migrations): 停用旧模型冲突别名
以可回滚的状态更新替代删除,满足生产迁移安全门禁。
2026-07-24 08:42:59 +08:00
wangbo 8b8e09cc22 fix(media): 支持大尺寸图像响应并补齐迁移契约
- 为图像协议放宽 JSON 响应上限并显式处理读取与超限错误
- 合并基础模型与平台能力,避免运行时丢失分辨率和比例约束
- 固化稳定 Gemini 图像模型的能力、计价和 preview 兼容别名
2026-07-24 08:40:30 +08:00
wangbo fb7e08fe5c fix(runtime): honor requested platform for routing 2026-07-24 07:56:48 +08:00
wangbo 22ee5bb624 fix(release): 修复首次发布基线解析 2026-07-23 23:54:31 +08:00
wangbo 76a7702925 fix(media): 对齐 EasyAI 媒体响应与转存策略
统一媒体异步提交和轮询响应,扩展 /ai/result 到当前用户的 Gateway 媒体任务,并保持既有 Gateway 字段兼容。\n\n启用转存但无可用渠道时回退到 24 小时本地静态资源;关闭转存时保留图片、音频等上游 Base64 字段。同步更新文件上传兼容结构、OpenAPI、管理端说明和回归测试。\n\n验证:cd apps/api && env -u AI_GATEWAY_TEST_DATABASE_URL go test ./... -count=1;gofmt -l 无输出;pnpm nx run web:typecheck。
2026-07-23 22:35:41 +08:00
wangbo 8b7d3e9c9a feat(seedance): 同步输入图片约束与自动转换 2026-07-23 21:55:42 +08:00
wangbo 46cdb1a288 fix(api): 缺失输出能力配置时透传请求 2026-07-23 11:07:31 +08:00
wangbo 8d86c4b3b3 feat(catalog): 统一模型调用身份并梳理生命周期
新增官方调用名、供应商真实名、显示名和兼容别名的独立契约,调整路由、目录聚合、管理端与 OpenAPI。

增加 Gemini、Qwen、DeepSeek、Claude 和 MiniMax 生命周期迁移、别名观测及引用保护,并补充数据库与聚合测试。
2026-07-22 20:23:36 +08:00
wangbo d0cfd0a385 Merge pull request 'feat: 合并网关能力与兼容性优化' (#15) from codex/gateway-feature-batch-20260721 into main
ci / verify (push) Successful in 10m38s
2026-07-22 01:17:45 +08:00
wangbo 0818f55235 fix(billing): 保留规则集未覆盖的基础资源价格
ci / verify (pull_request) Successful in 12m21s
2026-07-22 00:57:50 +08:00
wangbo fe83da56d2 test(e2e): 增加视频生产验收脚本与记录
ci / verify (pull_request) Failing after 3m43s
2026-07-22 00:25:22 +08:00
wangbo 002422b753 fix(catalog): 同步 GLM-5.2 文本能力配置 2026-07-22 00:25:22 +08:00
wangbo 24b778b3ba docs(api): 同步模型权限与 Kling 接口契约 2026-07-22 00:25:22 +08:00
wangbo d7951cfdd2 feat(volces): 接入任务兼容查询与上游取消 2026-07-22 00:25:22 +08:00
wangbo ddd68cfebd feat(seedance): 接入真人资产管理与引用 2026-07-22 00:25:22 +08:00
wangbo 5a71643099 feat(kling): 接入 Omni 视频兼容接口 2026-07-22 00:25:05 +08:00
wangbo b04a7d9d3d feat(web): 支持文档页真实提交请求 2026-07-22 00:24:36 +08:00
wangbo 6b675c406e fix(billing): 修正模型计费配置继承优先级 2026-07-22 00:24:36 +08:00
wangbo 56d4a3a6b7 fix(access): 修正 API Key 可分配模型范围 2026-07-22 00:24:36 +08:00
wangbo 276c0612d8 refactor(task): 复用网关任务创建流程 2026-07-22 00:24:36 +08:00
wangbo d818e7947a 调整 Gemini 模型接口路由 2026-07-22 00:24:36 +08:00
wangbo cc3bbeccc2 feat(web): 完善 API 文档与异步任务说明 2026-07-17 15:42:46 +08:00
wangbo 2d6c16fec0 chore(deps): 更新依赖包版本并添加vitest
- 将typescript从5.8.0更新至5.9.3版本
- 新增vitest依赖包,版本为3.2.4
- 配置vitest的子依赖关系包括@types/debug、jiti、lightningcss和yaml
2026-07-17 13:57:37 +08:00
wangbo 0d18df54f1 feat: 增加计费预估核对运维流程 2026-07-17 13:57:21 +08:00
wangbo bdcf9af5d6 chore: 忽略本地构建产物 2026-07-17 13:54:32 +08:00
wangbo 5ee267ecbd feat: 完善模型请求适配与输出限制 2026-07-17 13:52:00 +08:00
wangbo a24eb1aeb0 feat: 自托管 AI Gateway 运维管理 SKILL 2026-07-16 23:57:14 +08:00