phamnazage-jpg 85d495dd16 feat(control-plane): harden host-scoped reconcile and acceptance evidence
- add batch-scoped reconcile_runs persistence and queries
- route batch detail and reconcile writes through batch_id/host_id
- refresh production boards with host-scope acceptance artifacts
- include latest real-host acceptance evidence for self_service and subscription
2026-05-18 22:22:22 +08:00
2026-05-12 21:46:19 +08:00

sub2api-cn-relay-manager

sub2api-cn-relay-manager 是一个独立于 sub2api 宿主仓库的外部伴生安装器 / 控制面项目。

目标不是修改 sub2api,也不是把国产模型能力硬塞进宿主源码,而是通过 sub2api 已有的管理 API把“国产模型 OpenAI 兼容中转能力”以独立交付物的形式安装到任意一台已部署的 sub2api 实例上。

项目定位

  • 宿主:第三方开源系统 sub2api
  • 约束:不修改宿主代码,不 fork 宿主,不要求宿主内置原生插件运行时
  • 交付:一个独立控制面项目 + 一个或多个 model_pack
  • 结果:管理员可一键导入多个国产模型 key普通用户继续只用 sub2api 标准 API

这个项目解决的问题

  • 不同机器部署了 sub2api 后,如何用同一套交付物补齐国产模型中转能力
  • 如何把多个国产模型 key 批量导入为可用的宿主资源
  • 如何在不改宿主的前提下实现热生效、探测、对账和漂移发现
  • 如何让普通用户完全无感,继续走 sub2api 标准接口

非目标

  • 不做宿主原生插件系统
  • 不做任意第三方 Go 代码动态加载
  • 不要求宿主识别“插件”概念
  • 不接管宿主网关流量

目录结构

sub2api-cn-relay-manager/
  cmd/                         # 未来 CLI / server 入口
  internal/                    # 未来控制面后端实现
  web/                         # 未来管理端前端
  docs/
    2026-05-12-sub2api-cn-relay-manager-solution.md
  packs/
    openai-cn-pack/
      README.md
      pack.json.example
      providers/
        deepseek.json.example

交付模型

本项目最终会拆成两个可独立发布的产物:

  1. sub2api-cn-relay-manager

    • 外部控制面 / 安装器
    • 连接已有 sub2api
    • 安装模型包
    • 调用宿主管理 API 创建资源
    • 做 smoke test、对账和状态展示
  2. model_pack

    • 只包含 provider 定义、默认模板、导入规则和校验信息
    • 不携带宿主执行代码
    • 可以跨机器复用

当前文档

完整方案见:

当前 MVP 能力

当前仓库已经具备一个最小可运行闭环:

  • packs/openai-cn-pack/ 提供真实 pack.json + provider + checksums
  • internal/pack 负责 pack 装载、checksum 校验、provider schema 校验
  • internal/provision 负责多 key 导入编排、账号探测和访问闭环判定
  • cmd/cli import-provider 提供一键导入入口

示例:

go run ./cmd/cli import-provider \
  --host-base-url https://sub2api.example.com \
  --host-api-key <admin-api-key> \
  --pack-dir ./packs/openai-cn-pack \
  --provider-id deepseek \
  --keys sk-a,sk-b \
  --access-mode self_service \
  --access-api-key <user-api-key>

运行方式

服务端:

SUB2API_CRM_ADMIN_TOKEN=replace-me go run ./cmd/server

Docker Compose

cp .env.example .env
# 编辑 .env 中的 SUB2API_CRM_ADMIN_TOKEN
scripts/build_local_image.sh
docker run --rm -p 8080:8080 \
  --env-file .env \
  -v "$(pwd)/data:/data" \
  sub2api-cn-relay-manager:local
curl -fsS http://127.0.0.1:8080/healthz

真实宿主验收:

CRM_BASE_URL=http://127.0.0.1:8080 \
CRM_ADMIN_TOKEN='<crm-admin-token>' \
HOST_NAME=prod-sub2api \
HOST_BASE_URL=https://sub2api.example.com \
HOST_API_KEY='<sub2api-admin-key>' \
PACK_PATH=/app/packs/openai-cn-pack \
PROVIDER_ID=deepseek \
KEYS=sk-live-1 \
ACCESS_MODE=self_service \
ACCESS_API_KEY='<user-gateway-key>' \
DRY_RUN=1 \
scripts/real_host_acceptance.sh
Description
No description provided
Readme 56 MiB
Languages
Go 77.7%
HTML 13.6%
Shell 6.9%
PLpgSQL 1.1%
Python 0.6%