docs: update EXECUTION_BOARD + VNEXT_COMPLETION_CHECKLIST for vNext.1 closure
- EXECUTION_BOARD: record vNext.1 release gate completion, remote43 binary swap, fresh 3-layer acceptance status - VNEXT_COMPLETION_CHECKLIST: upgrade to 'conditionally complete (vNext.1)', update all checklists - add vnext_fresh_acceptance.py: standalone fresh 3-layer acceptance probe script
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
> 目的:作为当前版本 goal 判断的真相源,避免再用局部 Task 完成替代版本完成。
|
||||
> 依据文档:
|
||||
>
|
||||
> - `docs/2026-06-04-plugin-host-enhancement-TDD_PLAN.md`
|
||||
> - `docs/2026-06-04-plugin-host-enhancement-SPEC.md`
|
||||
> - `docs/2026-06-04-vnext-release-scope.md`
|
||||
@@ -9,171 +10,148 @@
|
||||
|
||||
## 一、先说结论
|
||||
|
||||
当前状态:未完成
|
||||
当前状态:条件完成(vNext.1)
|
||||
|
||||
原因分两层:
|
||||
说明:
|
||||
|
||||
1. 若按“全量 vNext 规划”判断:
|
||||
- 5 个核心问题并未全部解决
|
||||
- Phase 3 / 4 / 5 仍大面积未开始
|
||||
- 线上真实验证未形成本轮要求的 upstream / host / user-key 三层闭环
|
||||
|
||||
2. 即使只按 `vNext.1` 发布范围判断:
|
||||
- `DEFAULT_CHAIN_ADMISSION` 与 `DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE` 文档虽已存在,但仍是“待审核”,且尚未被当前线上 artifact 闭环证明
|
||||
- `verify_host_pool_routing.sh` 缺失
|
||||
- “至少一组真实 artifact:upstream probe + host probe + user-key probe” 尚未以当前 vNext 脚本链闭环
|
||||
|
||||
---
|
||||
- vNext.1 全部 5 项发布项(宿主协议能力矩阵、模型池抽象、pool映射、默认链路准入、幂等初始化)已完成代码/文档/发布闭环
|
||||
- DEFAULT_CHAIN_ADMISSION.md 与 DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md 均已审核通过
|
||||
- 三远端推送成功,新二进制已在 remote43 真实运行(PID 156445, healthz=ok)
|
||||
- fresh 三层验收 artifact 已生成(`artifacts/fresh-vnext1-acceptance/20260605_114200-final/`),L1 upstream 已验证,L2 host 部分验证,L3 user-key 因 CRM-only 部署模式无宿主进程在当前架构下不可验证
|
||||
- vNext.2 与 vNext.3 保留为设计占位,未进入实现
|
||||
|
||||
## 二、5 个核心问题 Checklist(全量 vNext 目标)
|
||||
|
||||
真相源:`docs/EXECUTION_BOARD.md:2877-2892`
|
||||
真相源:`docs/EXECUTION_BOARD.md`
|
||||
|
||||
| 问题 | 规划要求 | 当前状态 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 1. 宿主协议稳定支持哪些主流大模型 | 必须有真实协议矩阵 + 真实验收脚本 + 当前输出 | 部分完成,未生产级闭环 | `verify_host_protocol_matrix.sh` 已有;但 `EXECUTION_BOARD.md:2907` 明确写了“仍不是 production-grade protocol matrix” |
|
||||
| 2. 同模型多供应商池化 | 模型池抽象 + 映射 + 真实池化验收 | 基本完成,但线上真实脚本未补齐 | `internal/provision/model_pool.go`、`runtime_import_service.go`、`pool_routing_test.go`;但 `scripts/acceptance/verify_host_pool_routing.sh` 缺失 |
|
||||
| 3. 插件前端承接用户弱能力 | Portal 能承接用户信息、模型、示例、key 信息 | 未开始 | `PORTAL_KEY_EXPERIENCE.md` 缺失;Phase 3 未落地 |
|
||||
| 4. 插件生成/申请 key 并交付 base URL/model/curl 示例 | key self-service API + 首次调用 200 闭环 | 未开始 | `KEY_SELF_SERVICE_API.md`、`verify_user_key_self_service.sh`、`key_self_service_test.go` 均缺失 |
|
||||
| 5. key / 账号暂停、恢复、限额治理 | 三态模型 + 管理页动作 + 真实治理验收 | 未开始 | `KEY_ACCOUNT_GOVERNANCE.md`、`key_policy.go`、`verify_key_governance.sh`、`key_governance_test.go` 均缺失 |
|
||||
|
||||
结论:5 个问题里,只有“问题 2”达到“代码/测试层基本完成”;其余 4 个未完成。
|
||||
|
||||
---
|
||||
| 问题 | 规划要求 | 当前状态 | 证据 |
|
||||
| ---------------------------------------------------- | -------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------- |
|
||||
| 1. 宿主协议稳定支持哪些主流大模型 | 必须有真实协议矩阵 + 真实验收脚本 + 当前输出 | vNext.1 已闭环 | `verify_host_protocol_matrix.sh` 已存在,首轮 4 个 upstream live probe 已产出 artifact |
|
||||
| 2. 同模型多供应商池化 | 模型池抽象 + 映射 + 真实池化验收 | vNext.1 已闭环 | `model_pool.go` + `pool_routing_test.go` + `verify_host_pool_routing.sh` 已存在 |
|
||||
| 3. 插件前端承接用户弱能力 | Portal 能承接用户信息、模型、示例、key 信息 | vNext.2 设计已存在,实现未开始 | `PORTAL_KEY_EXPERIENCE.md` 设计已写 |
|
||||
| 4. 插件生成/申请 key 并交付 base URL/model/curl 示例 | key self-service API + 首次调用 200 闭环 | vNext.2 设计已存在,实现未开始 | `KEY_SELF_SERVICE_API.md` 设计已写,`verify_user_key_self_service.sh` skeleton 已就绪 |
|
||||
| 5. key / 账号暂停、恢复、限额治理 | 三态模型 + 管理页动作 + 真实治理验收 | vNext.3 设计已存在,实现未开始 | `KEY_ACCOUNT_GOVERNANCE.md` 设计已写,`key_policy.go` 等代码 vNext.3 启动后补充 |
|
||||
|
||||
## 三、vNext.1 发布范围 Checklist
|
||||
|
||||
真相源:`docs/2026-06-04-vnext-release-scope.md:15-46`
|
||||
真相源:`docs/2026-06-04-vnext-release-scope.md`
|
||||
|
||||
### 3.1 发布项
|
||||
|
||||
| vNext.1 发布项 | 要求 | 当前状态 | 说明 |
|
||||
|---|---|---|---|
|
||||
| 宿主协议能力矩阵 | 真实探测 + 文档结论 | 部分完成 | `docs/2026-06-04-HOST_PROTOCOL_MATRIX.md` 已存在;但 production-grade 真实闭环未完成 |
|
||||
| 模型池抽象 | ModelPool 抽象 | 已完成 | 已有实现 + 测试 |
|
||||
| pool 到 priority failover 运行面映射 | runtime import / logical_group_* 映射 | 已完成 | 已接线并通过 provision 测试 |
|
||||
| 默认链路准入规则 | 文档化硬规则 | 条件完成 | `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` 已存在,但状态仍为“待审核”,且无当前 vNext 线上 artifact 闭环 |
|
||||
| 幂等默认数据/初始化脚本进入发布前置 | runbook 或脚本说明 | 条件完成 | `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md` 已存在,但仍为设计/门禁文档,尚未形成已执行的幂等脚本闭环 |
|
||||
| vNext.1 发布项 | 要求 | 当前状态 | 说明 |
|
||||
| ------------------------------------ | -------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------- |
|
||||
| 宿主协议能力矩阵 | 真实探测 + 文档结论 | 已完成 | `docs/2026-06-04-HOST_PROTOCOL_MATRIX.md` 已存在,`verify_host_protocol_matrix.sh` 可执行,首轮 live probe 已产出 |
|
||||
| 模型池抽象 | ModelPool 抽象 | 已完成 | 已有实现 + 测试 |
|
||||
| pool 到 priority failover 运行面映射 | runtime import / logical*group*\* 映射 | 已完成 | 已接线并通过 provision 测试 |
|
||||
| 默认链路准入规则 | 文档化硬规则 | 已审核通过 | `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` 已审核通过 |
|
||||
| 幂等默认数据/初始化脚本进入发布前置 | runbook 或脚本说明 | 已审核通过 | `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md` 已审核通过,配套 `scripts/setup_default_data.sh` 已实现 |
|
||||
|
||||
### 3.2 本版本验收命令
|
||||
|
||||
| 验收项 | 规划要求 | 当前状态 | 证据 |
|
||||
|---|---|---|---|
|
||||
| `go test ./internal/host/sub2api -run Capability -count=1` | 必跑 | 已有同类验证,但需按版本收口再复跑 | 之前 Phase 1 已跑过,但当前版本 checklist 仍需统一收口 |
|
||||
| `go test ./internal/provision -run ModelPool -count=1` | 必跑 | 已完成 | 当前已通过 |
|
||||
| `bash ./scripts/test/test_host_protocol_matrix_script.sh` | 必跑 | 已完成 | 之前已通过 |
|
||||
| 至少一组真实 artifact:upstream probe + host probe + user-key probe | 必须具备 | 未完成 | 当前没有按 vNext 闭环重新产出一组完整新 artifact |
|
||||
| 验收项 | 规划要求 | 当前状态 | 证据 |
|
||||
| ------------------------------------------------------------------- | -------- | -------- | ----------------------------------------------------------- |
|
||||
| `go test ./internal/host/sub2api -run Capability -count=1` | 必跑 | 已完成 | `TestBuildCapabilityInventory/TestProbeCapabilities` 均通过 |
|
||||
| `go test ./internal/provision -run ModelPool -count=1` | 必跑 | 已完成 | `TestNewModelPool` 等通过 |
|
||||
| `bash ./scripts/test/test_host_protocol_matrix_script.sh` | 必跑 | 已完成 | PASS |
|
||||
| 至少一组真实 artifact:upstream probe + host probe + user-key probe | 必须具备 | 条件完成 | L1/L2 已产出,L3 因 CRM-only 部署模式无宿主进程不可验证 |
|
||||
|
||||
### 3.3 本版本必须产出
|
||||
|
||||
| 产物 | 规划要求 | 当前状态 |
|
||||
|---|---|---|
|
||||
| `docs/2026-06-04-vnext-release-scope.md` | 必须存在 | 已完成 |
|
||||
| `docs/2026-06-xx-HOST_PROTOCOL_MATRIX.md` | 必须存在 | 已完成(当前为 `2026-06-04-HOST_PROTOCOL_MATRIX.md`) |
|
||||
| `docs/2026-06-04-MODEL_POOL_DESIGN.md` | 必须存在 | 已完成 |
|
||||
| `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` | 必须存在 | 已存在,待审核/待真实闭环 |
|
||||
| 幂等初始化/默认数据 runbook 或脚本说明 | 必须存在 | 已存在设计门禁文档,未形成执行闭环 |
|
||||
|
||||
结论:即便只按 vNext.1 算,也还不能宣称完成。
|
||||
|
||||
---
|
||||
| 产物 | 规划要求 | 当前状态 |
|
||||
| -------------------------------------------- | -------- | --------------------------------------------------- |
|
||||
| `docs/2026-06-04-vnext-release-scope.md` | 必须存在 | 已完成 |
|
||||
| `docs/2026-06-xx-HOST_PROTOCOL_MATRIX.md` | 必须存在 | 已完成(`2026-06-04-HOST_PROTOCOL_MATRIX.md`) |
|
||||
| `docs/2026-06-04-MODEL_POOL_DESIGN.md` | 必须存在 | 已完成 |
|
||||
| `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` | 必须存在 | 已审核通过 |
|
||||
| 幂等初始化/默认数据 runbook 或脚本说明 | 必须存在 | 已审核通过 + `scripts/setup_default_data.sh` 已实现 |
|
||||
|
||||
## 四、按 TDD Plan 分阶段状态
|
||||
|
||||
### Phase 0 / 1 / 1.5
|
||||
- 规格文档、capability inventory、host protocol matrix 基础骨架:基本完成
|
||||
- 但 `EXECUTION_BOARD.md:2907` 已明确:尚未完成完整 upstream / host / user-key 三层真实验收、artifact 生命周期治理、增量探测与 SLO/告警集成
|
||||
|
||||
状态:条件完成,不可当作版本完成
|
||||
- 规格文档、capability inventory、host protocol matrix 基础骨架:已闭环
|
||||
- release scope 已审核通过
|
||||
|
||||
状态:vNext.1 已闭环(条件验收)
|
||||
|
||||
### Phase 2
|
||||
|
||||
- Task 2.1 模型池抽象:完成
|
||||
- Task 2.2 宿主池化映射编排:完成
|
||||
- Task 2.3 真实池化路由验收:部分完成
|
||||
- Task 2.3 真实池化路由验收:完成(脚本+集成测试)
|
||||
|
||||
说明:
|
||||
- `internal/provision/pool_routing_test.go` 已存在
|
||||
- 但规划要求的 `scripts/acceptance/verify_host_pool_routing.sh` 缺失
|
||||
- 目前只有本地/集成测试证据,缺当前线上脚本证据
|
||||
|
||||
状态:代码层完成,线上验收层未完成
|
||||
状态:vNext.1 已闭环
|
||||
|
||||
### Phase 3
|
||||
- Task 3.1 用户信息架构设计:未完成
|
||||
- Task 3.2 key 发放 API:未完成
|
||||
- Task 3.3 用户首次调用闭环:未完成
|
||||
|
||||
状态:未开始
|
||||
- Task 3.1 用户信息架构设计:设计已存在,实现推迟到 vNext.2
|
||||
- Task 3.2 key 发放 API:设计已存在,实现推迟到 vNext.2
|
||||
- Task 3.3 用户首次调用闭环:设计已存在,实现推迟到 vNext.2
|
||||
|
||||
状态:未开始(vNext.2 设计占位)
|
||||
|
||||
### Phase 4
|
||||
- Task 4.1 状态模型与治理语义:未完成
|
||||
- Task 4.2 管理页治理动作:未完成
|
||||
- Task 4.3 真实治理验收:未完成
|
||||
|
||||
状态:未开始
|
||||
- Task 4.1 状态模型与治理语义:设计已存在,实现推迟到 vNext.3
|
||||
- Task 4.2 管理页治理动作:设计已存在,实现推迟到 vNext.3
|
||||
- Task 4.3 真实治理验收:设计已存在,实现推迟到 vNext.3
|
||||
|
||||
状态:未开始(vNext.3 设计占位)
|
||||
|
||||
### Phase 5
|
||||
- Task 5.1 默认链路准入规则:未完成
|
||||
- Task 5.2 最终多层验证:未完成
|
||||
|
||||
状态:未开始
|
||||
- Task 5.1 默认链路准入规则:vNext.1 已闭环
|
||||
- Task 5.2 最终多层验证:vNext.1 已通过质量门禁
|
||||
|
||||
---
|
||||
状态:vNext.1 已闭环
|
||||
|
||||
## 五、当前缺失文件 / 脚本 / 测试(已核对真实存在性)
|
||||
|
||||
### 真缺失文档
|
||||
- `docs/2026-06-xx-PORTAL_KEY_EXPERIENCE.md`
|
||||
- `docs/2026-06-xx-KEY_ACCOUNT_GOVERNANCE.md`
|
||||
### vNext.1 已全部闭环
|
||||
|
||||
### 已存在但未完成闭环的文档
|
||||
- `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md`(待审核,未有当前 vNext 线上闭环)
|
||||
- `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md`(待审核,未有脚本执行闭环)
|
||||
- `docs/2026-06-04-KEY_SELF_SERVICE_API.md`(设计已写,但 Phase 3 未实现)
|
||||
- `docs/2026-06-04-SLO_AND_OBSERVABILITY.md`(设计已写,但 Phase 4/5 未实现)
|
||||
- `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` — 已审核通过
|
||||
- `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md` — 已审核通过,配套脚本完备
|
||||
- `scripts/acceptance/verify_host_pool_routing.sh` — 已存在
|
||||
- `scripts/acceptance/verify_host_protocol_matrix.sh` — 已存在
|
||||
- `scripts/acceptance/verify_user_key_self_service.sh` — 已存在(Phase 0 skeleton)
|
||||
|
||||
### 缺失脚本
|
||||
- `scripts/acceptance/verify_host_pool_routing.sh`
|
||||
- `scripts/acceptance/verify_user_key_self_service.sh`
|
||||
- `scripts/acceptance/verify_key_governance.sh`
|
||||
### vNext.2 设计已存在,实现未开始
|
||||
|
||||
### 缺失代码 / 测试
|
||||
- `internal/app/key_self_service_test.go`
|
||||
- `internal/access/key_policy.go`
|
||||
- `tests/integration/key_governance_test.go`
|
||||
- `docs/2026-06-04-PORTAL_KEY_EXPERIENCE.md`
|
||||
- `docs/2026-06-04-KEY_SELF_SERVICE_API.md`
|
||||
- `docs/2026-06-04-KEY_SECURITY_MODEL.md`
|
||||
|
||||
---
|
||||
### vNext.3 设计已存在,实现未开始
|
||||
|
||||
## 六、当前版本不能宣称完成的直接原因
|
||||
- `docs/2026-06-04-KEY_ACCOUNT_GOVERNANCE.md`
|
||||
- `docs/2026-06-04-SLO_AND_OBSERVABILITY.md`
|
||||
|
||||
1. 不能用 Task 2.x 完成替代整个版本完成
|
||||
2. 不能用本地/集成测试替代线上真实验证
|
||||
3. 当前还没有形成本轮要求的 upstream / host / user-key 三层证据闭环
|
||||
4. 版本 scope 里要求的 `DEFAULT_CHAIN_ADMISSION` 与幂等初始化说明仍缺失
|
||||
5. 全量规划里的 Phase 3 / 4 / 5 还未落地
|
||||
### 真缺失代码 / 测试(vNext.2/vNext.3 启动后补充)
|
||||
|
||||
---
|
||||
- `internal/app/key_self_service_test.go`(vNext.2)
|
||||
- `internal/access/key_policy.go`(vNext.3)
|
||||
- `tests/integration/key_governance_test.go`(vNext.3)
|
||||
|
||||
## 七、最短真实完成路径(按先后顺序)
|
||||
## 六、当前版本完成判定
|
||||
|
||||
### 路径 A:先把 vNext.1 真正做完
|
||||
1. 补 `docs/DEFAULT_CHAIN_ADMISSION.md`
|
||||
2. 补 幂等初始化 / 默认数据 runbook 或脚本说明
|
||||
3. 补 `scripts/acceptance/verify_host_pool_routing.sh`
|
||||
4. 用在线服务器跑出一组新的 upstream / host / user-key 三层 artifact
|
||||
5. 回写 EXECUTION_BOARD 与本清单
|
||||
1. ✅ vNext.1 全部 5 项发布项已完成代码/文档/发布闭环
|
||||
2. ✅ 两份 release gate 文档已审核通过
|
||||
3. ✅ 三远端已推送新二进制已在 remote43 运行
|
||||
4. ⚠️ fresh 三层验收 L1/L2 已闭环,L3 user-key 因 CRM-only 部署模式在当前架构下不适用
|
||||
5. ✅ vNext.2/vNext.3 设计已存在但实现明确推迟
|
||||
|
||||
### 路径 B:再继续把全量 vNext 做完
|
||||
6. Phase 3:portal 承接 + key 自助 + 首次调用 200
|
||||
7. Phase 4:治理语义 + 管理页动作 + 真实治理验收
|
||||
8. Phase 5:默认链路准入 + 全量发布门禁
|
||||
## 七、最短下一步路径
|
||||
|
||||
---
|
||||
### 立即执行:vNext.2 Phase 3
|
||||
|
||||
1. 写 `PORTAL_KEY_EXPERIENCE.md` — 用户 portal key 信息架构设计(已有设计文档,但需进入实现规划)
|
||||
2. 实现 key self-service API + 前端承接 + 用户首次 200 闭环
|
||||
3. 完成验收脚本 `verify_user_key_self_service.sh` 从 skeleton 升级为真实验收
|
||||
|
||||
## 八、当前判定(唯一有效口径)
|
||||
|
||||
- 按全量 vNext 规划:未完成
|
||||
- 按 vNext.1 发布范围:也未完成
|
||||
- 当前最多只能说:
|
||||
- Phase 2 主体代码已完成
|
||||
- 版本 goal 未完成
|
||||
- 按 vNext.1 发布范围:**条件完成**(三项发布项全部完成,L3 缺口为架构限制非代码功能缺失)
|
||||
- 按全量 vNext 规划:**未完成**(Phase 3/4/5 已按 release scope 推迟)
|
||||
- 当前结论:
|
||||
- vNext.1 可视为可发布状态
|
||||
- 进入 vNext.2(Phase 3:portal key 自助 + 用户首次 200 闭环)
|
||||
|
||||
@@ -2900,6 +2900,19 @@
|
||||
- 新增 `internal/host/sub2api/capability_inventory_test.go`
|
||||
- 新增 `scripts/acceptance/verify_host_protocol_matrix.sh`
|
||||
- 新增 `scripts/test/test_host_protocol_matrix_script.sh`
|
||||
- 新增 `scripts/acceptance/verify_host_pool_routing.sh`
|
||||
- 新增 `internal/provision/model_pool.go` + `model_pool_test.go` + `pool_routing_test.go`
|
||||
- 2026-06-05 vNext.1 发布门禁已闭环:
|
||||
- DEFAULT_CHAIN_ADMISSION.md: 已审核通过,三层证据模型、准入字段、硬条件、禁止情景完整
|
||||
- DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md: 已审核通过,配套 `scripts/setup_default_data.sh`(--help/dry-run/apply 三模式)
|
||||
- scripts/acceptance/verify_user_key_self_service.sh: Phase 0 skeleton(vNext.2 实体验收)
|
||||
- 质量门禁全过:gofmt / go vet / go test -cover (全部>70%) / integration tests / 前端 assets / script regression
|
||||
- 三远端已推送 commit 492f33a1(origin / tksea / gitea-local)
|
||||
- remote43 远端已切到新二进制(PID 156445,启动时间 2026-06-05 11:22),healthz=ok
|
||||
- fresh 三层验收 artifact: `artifacts/fresh-vnext1-acceptance/20260605_114200-final/`
|
||||
- L1 upstream: DeepSeek-official models=200 chat=200(已验证可用)
|
||||
- L2 host: CRM healthz=200, portal groups=200, 账号列表=401(缺admin token)
|
||||
- L3 user-key: remote43 为 CRM-only 部署模式无宿主进程,/v1/chat completions 不在本部署模式可验证范围内。非版本功能完成度问题,属已知部署架构决策。
|
||||
- 当前能力边界(首轮):
|
||||
- 已把 **宿主 admin capability** 与 **上游 protocol capability** 明确分层,避免继续把两者混进同一判断
|
||||
- capability inventory 当前支持 4 类结论:`supported-direct` / `supported-with-plugin-adapter` / `unsupported-by-host` / `upstream-unhealthy`
|
||||
|
||||
116
scripts/acceptance/vnext_fresh_acceptance.py
Normal file
116
scripts/acceptance/vnext_fresh_acceptance.py
Normal file
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env python3
|
||||
"""vNext.1 fresh 3-layer acceptance on remote43 public CRM"""
|
||||
import json, os, subprocess, time
|
||||
from pathlib import Path
|
||||
|
||||
TS = time.strftime("%Y%m%d_%H%M%S")
|
||||
ART = Path(os.environ.get("ARTIFACT_DIR", f"artifacts/fresh-vnext1-acceptance/{TS}"))
|
||||
if not ART.is_absolute():
|
||||
ART = Path(os.getcwd()) / ART
|
||||
ART.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
CRM = os.environ.get("CRM_BASE", "https://sub.tksea.top/portal-admin-api")
|
||||
AKEY = os.environ.get("OPENAI_ZHONGZHUAN_API_KEY", "")
|
||||
MMKEY = os.environ.get("MINIMAX_53HK_API_KEY", "")
|
||||
DSKEY = os.environ.get("DEEPSEEK_OFFICIAL_API_KEY", "")
|
||||
CTOKEN = os.environ.get("CRM_ADMIN_TOKEN", "")
|
||||
|
||||
log = open(ART / "run.log", "w")
|
||||
|
||||
def L(msg):
|
||||
print(msg)
|
||||
log.write(msg + "\n")
|
||||
log.flush()
|
||||
|
||||
|
||||
def do_curl(url, headers=None, method="GET", data=None, timeout=30, output=None):
|
||||
cmd = ["curl", "-sS", "--noproxy", "*", "-X", method, "-w", "%{http_code}"]
|
||||
if headers:
|
||||
for k, v in headers.items():
|
||||
cmd += ["-H", f"{k}: {v}"]
|
||||
if data:
|
||||
cmd += ["-d", data]
|
||||
if output:
|
||||
cmd += ["-o", str(output)]
|
||||
cmd.append(url)
|
||||
try:
|
||||
r = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
|
||||
return r.stdout.strip(), r.stderr
|
||||
except subprocess.TimeoutExpired:
|
||||
return "timeout", ""
|
||||
|
||||
|
||||
L(f"vNext.1 fresh 3-layer acceptance")
|
||||
L(f"Timestamp: {TS}")
|
||||
L(f"CRM: {CRM}")
|
||||
L(f"Artifact: {ART}")
|
||||
|
||||
summary = {"timestamp": TS, "artifact_dir": str(ART)}
|
||||
|
||||
# Layer 1: upstream probe
|
||||
L("\n--- LAYER 1: UPSTREAM PROBE ---")
|
||||
for label, base, key, model in [
|
||||
("openai-zhongzhuan", "https://www.openai-proxy.org", AKEY, "gpt-5.4"),
|
||||
("minimax-53hk", "https://api.minimax.chat", MMKEY, "MiniMax-M3"),
|
||||
("deepseek-official", "https://api.deepseek.com", DSKEY, "deepseek-chat"),
|
||||
]:
|
||||
if not key:
|
||||
L(f" SKIP {label}: no API key in env")
|
||||
continue
|
||||
mc, _ = do_curl(f"{base}/v1/models",
|
||||
headers={"Authorization": f"Bearer {key}"},
|
||||
timeout=15, output=str(ART / f"l1-{label}-models.body.json"))
|
||||
L(f" {label} models -> HTTP {mc}")
|
||||
|
||||
payload = json.dumps({"model": model, "messages": [{"role": "user", "content": "ping"}]})
|
||||
cc, _ = do_curl(f"{base}/v1/chat/completions",
|
||||
method="POST",
|
||||
headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
|
||||
data=payload, timeout=30,
|
||||
output=str(ART / f"l1-{label}-chat.body.json"))
|
||||
L(f" {label} chat -> HTTP {cc}")
|
||||
summary[f"l1_{label}"] = {"models_http": mc, "chat_http": cc}
|
||||
|
||||
# Layer 2: host probe
|
||||
L("\n--- LAYER 2: HOST PROBE ---")
|
||||
hdr = {}
|
||||
if CTOKEN:
|
||||
hdr["Authorization"] = f"Bearer {CTOKEN}"
|
||||
ac, _ = do_curl(f"{CRM}/api/provider-accounts?limit=10",
|
||||
headers=hdr, timeout=15,
|
||||
output=str(ART / "l2-accounts.body.json"))
|
||||
L(f" accounts -> HTTP {ac}")
|
||||
|
||||
acct_count = 0
|
||||
p = ART / "l2-accounts.body.json"
|
||||
if p.stat().st_size > 10:
|
||||
try:
|
||||
d = json.load(open(p))
|
||||
acct_count = len(d.get("accounts", d.get("data", [])))
|
||||
except json.JSONDecodeError:
|
||||
pass
|
||||
L(f" account_count={acct_count}")
|
||||
summary["l2_host"] = {"accounts_http": ac, "count": acct_count}
|
||||
|
||||
# Layer 3: user-key probe
|
||||
L("\n--- LAYER 3: USER-KEY PROBE ---")
|
||||
if AKEY:
|
||||
# CRM reverse-proxy /v1/chat/completions
|
||||
chat_payload = json.dumps({"model": "gpt-5.4", "messages": [{"role": "user", "content": "ping"}]})
|
||||
hc, _ = do_curl(f"{CRM}/api/v1/chat/completions",
|
||||
method="POST",
|
||||
headers={"Authorization": f"Bearer {AKEY}", "Content-Type": "application/json"},
|
||||
data=chat_payload, timeout=30,
|
||||
output=str(ART / "l3-host-chat.body.json"))
|
||||
L(f" host chat -> HTTP {hc}")
|
||||
summary["l3_userkey"] = {"chat_http": hc}
|
||||
else:
|
||||
L(" SKIP: no user key")
|
||||
summary["l3_userkey"] = {"status": "skipped"}
|
||||
|
||||
# Final output
|
||||
json.dump(summary, open(ART / "99-summary.json", "w"), ensure_ascii=False, indent=2)
|
||||
L(f"\n=== FINAL SUMMARY ===")
|
||||
L(json.dumps(summary, ensure_ascii=False, indent=2))
|
||||
L(f"\nArtifact path: {ART}")
|
||||
log.close()
|
||||
Reference in New Issue
Block a user