phamnazage-jpg 9134afed9f fix(provision): stabilize kimi a7m import closure
Downgrade the first third-party account test 403 to an advisory warning when models are already present, and retry transient gateway completion 503 responses during access closure.

Add regression coverage for the probe race and completion retry paths, update the execution board, and store the final v0.1.129 Kimi A7M fresh-host acceptance artifact that now reaches succeeded/active/subscription_ready.
2026-05-22 12:33:12 +08:00
2026-05-12 21:46:19 +08:00
2026-05-22 07:43:42 +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%