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
This commit is contained in:
28
Dockerfile
28
Dockerfile
@@ -1,11 +1,35 @@
|
||||
FROM golang:1.22.2 AS builder
|
||||
ARG http_proxy=
|
||||
ARG https_proxy=
|
||||
ARG HTTP_PROXY=
|
||||
ARG HTTPS_PROXY=
|
||||
ARG no_proxy=
|
||||
ARG NO_PROXY=
|
||||
ENV http_proxy= \
|
||||
https_proxy= \
|
||||
HTTP_PROXY= \
|
||||
HTTPS_PROXY= \
|
||||
no_proxy= \
|
||||
NO_PROXY=
|
||||
WORKDIR /src
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
RUN GOPROXY=https://proxy.golang.org,direct go mod download
|
||||
COPY . .
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o /out/sub2api-cn-relay-manager ./cmd/server
|
||||
RUN GOPROXY=https://proxy.golang.org,direct CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o /out/sub2api-cn-relay-manager ./cmd/server
|
||||
|
||||
FROM debian:bookworm-slim
|
||||
ARG http_proxy=
|
||||
ARG https_proxy=
|
||||
ARG HTTP_PROXY=
|
||||
ARG HTTPS_PROXY=
|
||||
ARG no_proxy=
|
||||
ARG NO_PROXY=
|
||||
ENV http_proxy= \
|
||||
https_proxy= \
|
||||
HTTP_PROXY= \
|
||||
HTTPS_PROXY= \
|
||||
no_proxy= \
|
||||
NO_PROXY=
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends ca-certificates tzdata wget \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
30
Dockerfile.local
Normal file
30
Dockerfile.local
Normal file
@@ -0,0 +1,30 @@
|
||||
# Local-dev Dockerfile: uses prebuilt binary to avoid proxy issues in Docker.
|
||||
# Usage:
|
||||
# GOTOOLCHAIN=local CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
|
||||
# go build -trimpath -ldflags='-s -w' -o bin/sub2api-cn-relay-manager ./cmd/server
|
||||
# docker build -f Dockerfile.local -t sub2api-cn-relay-manager:local .
|
||||
FROM debian:bookworm-slim
|
||||
ARG http_proxy=
|
||||
ARG https_proxy=
|
||||
ARG HTTP_PROXY=
|
||||
ARG HTTPS_PROXY=
|
||||
ARG no_proxy=
|
||||
ARG NO_PROXY=
|
||||
ENV http_proxy= \
|
||||
https_proxy= \
|
||||
HTTP_PROXY= \
|
||||
HTTPS_PROXY= \
|
||||
no_proxy= \
|
||||
NO_PROXY=
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends ca-certificates tzdata wget \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& update-ca-certificates
|
||||
WORKDIR /app
|
||||
COPY bin/sub2api-cn-relay-manager /usr/local/bin/sub2api-cn-relay-manager
|
||||
ENV SUB2API_CRM_LISTEN_ADDR=:8080
|
||||
ENV SUB2API_CRM_SQLITE_DSN=file:/data/sub2api-cn-relay-manager.db?_foreign_keys=on&_busy_timeout=5000
|
||||
ENV SUB2API_CRM_ADMIN_TOKEN=
|
||||
VOLUME ["/data"]
|
||||
EXPOSE 8080
|
||||
ENTRYPOINT ["/usr/local/bin/sub2api-cn-relay-manager"]
|
||||
24
README.md
24
README.md
@@ -67,6 +67,7 @@ sub2api-cn-relay-manager/
|
||||
- [docs/TDD_PLAN.md](./docs/TDD_PLAN.md)
|
||||
- [docs/EXECUTION_BOARD.md](./docs/EXECUTION_BOARD.md)
|
||||
- [docs/DEPLOYMENT.md](./docs/DEPLOYMENT.md)
|
||||
- [docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md](./docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md)
|
||||
|
||||
## 当前 MVP 能力
|
||||
|
||||
@@ -104,6 +105,27 @@ Docker Compose:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# 编辑 .env 中的 SUB2API_CRM_ADMIN_TOKEN
|
||||
docker compose up --build -d
|
||||
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
|
||||
```
|
||||
|
||||
真实宿主验收:
|
||||
|
||||
```bash
|
||||
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
|
||||
```
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:8080/api/hosts"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:8080/api/hosts/prod-sub2api/probe"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:8080/api/packs/install"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:8080/api/providers/deepseek/preview-import"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:8080/api/providers/deepseek/import"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:8080/api/providers/deepseek/access/preview"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"GET","url":"http://127.0.0.1:8080/api/providers/deepseek/access/status"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"GET","url":"http://127.0.0.1:8080/api/providers/deepseek/status"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:8080/api/providers/deepseek/reconcile"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/hosts"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/hosts/local-sub2api/probe"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/packs/install"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/preview-import"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/import"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/access/preview"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"GET","url":"http://127.0.0.1:18081/api/providers/deepseek/access/status"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"GET","url":"http://127.0.0.1:18081/api/providers/deepseek/status"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/reconcile"}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":false,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/hosts"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/hosts/local-sub2api/probe"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/packs/install"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/preview-import"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/import"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/access/preview"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"GET","url":"http://127.0.0.1:18081/api/providers/deepseek/access/status"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"GET","url":"http://127.0.0.1:18081/api/providers/deepseek/status"}
|
||||
@@ -0,0 +1 @@
|
||||
{"dry_run":true,"method":"POST","url":"http://127.0.0.1:18081/api/providers/deepseek/reconcile"}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":true,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":true,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"create","Suggested":"crm-deepseek-channel","ExistingID":"","Reason":""},"group":{"Action":"create","Suggested":"crm-deepseek-group","ExistingID":"","Reason":""},"plan":{"Action":"create","Suggested":"crm-deepseek-plan","ExistingID":"","Reason":""}},"names":{"Group":"crm-deepseek-group","Channel":"crm-deepseek-channel","Plan":"crm-deepseek-plan"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":false,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"},{"display_name":"MiniMax OpenAI Compatible","provider_id":"minimax"},{"display_name":"OpenAI 中转兼容","provider_id":"openai-zhongzhuan"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"create","Suggested":"OpenAI 中转默认渠道","ExistingID":"","Reason":""},"group":{"Action":"reuse","Suggested":"OpenAI 中转默认分组","ExistingID":"18","Reason":"matching managed resource already exists"},"plan":{"Action":"create","Suggested":"OpenAI 中转默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"OpenAI 中转默认分组","Channel":"OpenAI 中转默认渠道","Plan":"OpenAI 中转默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"access_status":"broken","accounts_count":1,"batch_id":1,"batch_status":"partially_succeeded","channel":{"id":"10","name":"OpenAI 中转默认渠道"},"gateway":{"ok":false,"status_code":403,"models":null,"has_expected_model":false},"group":{"id":"18","name":"OpenAI 中转默认分组"},"plan":null,"provider_status":"degraded"}
|
||||
@@ -0,0 +1 @@
|
||||
{"provider_id":"openai-zhongzhuan","mode":"self_service","available":false,"message":"access status broken does not satisfy mode self_service"}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_access_status":"broken","batch_id":1,"closures_count":1,"latest_access_status":"broken","latest_closure":{"closure_type":"self_service","details_json":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}","id":1,"status":"broken"},"pack_id":"openai-cn-pack","provider_id":"openai-zhongzhuan"}
|
||||
@@ -0,0 +1 @@
|
||||
{"access_closures_count":1,"batch":{"access_status":"broken","batch_status":"partially_succeeded","id":1,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18080","host_id":"http://127.0.0.1:18080","host_version":"0.1.126"},"latest_access_status":"broken","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":3,"pack":{"pack_id":"openai-cn-pack","version":"1.0.0"},"provider":{"display_name":"OpenAI 中转兼容","platform":"openai","provider_id":"openai-zhongzhuan"},"provider_status":"partially_succeeded","reconcile_runs_count":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_id":1,"extra_count":11,"missing_count":0,"provider_id":"openai-zhongzhuan","status":"drifted","summary":{"access_rechecked":true,"access_status":"broken","extra_count":11,"host_version":"0.1.126","missing_count":0,"probe_failures":0}}
|
||||
@@ -0,0 +1 @@
|
||||
{"access_closures":[{"ID":1,"BatchID":1,"ClosureType":"self_service","Status":"broken","DetailsJSON":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}"},{"ID":2,"BatchID":1,"ClosureType":"self_service","Status":"broken","DetailsJSON":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"reconcile_rerun\":true,\"status_code\":403}"}],"access_count":2,"batch":{"access_status":"broken","batch_status":"partially_succeeded","host_id":2,"id":1,"mode":"partial","pack_id":1,"provider_id":3},"items":[{"account_status":"passed","batch_id":1,"id":1,"key_fingerprint":"sha256:fbd0fe64bde9bf5e4fbc1b648540139ae34473dbdd07905a72b1e90970bddce5","probe_summary_json":"{\"account_id\":\"20\",\"models\":[{\"id\":\"gpt-5.5\",\"display_name\":\"GPT-5.5\",\"type\":\"model\"},{\"id\":\"gpt-5.4\",\"display_name\":\"GPT-5.4\",\"type\":\"model\"},{\"id\":\"gpt-5.4-mini\",\"display_name\":\"GPT-5.4 Mini\",\"type\":\"model\"},{\"id\":\"gpt-5.3-codex\",\"display_name\":\"GPT-5.3 Codex\",\"type\":\"model\"},{\"id\":\"gpt-5.3-codex-spark\",\"display_name\":\"GPT-5.3 Codex Spark\",\"type\":\"model\"},{\"id\":\"gpt-5.2\",\"display_name\":\"GPT-5.2\",\"type\":\"model\"},{\"id\":\"gpt-image-1\",\"display_name\":\"GPT Image 1\",\"type\":\"model\"},{\"id\":\"gpt-image-1.5\",\"display_name\":\"GPT Image 1.5\",\"type\":\"model\"},{\"id\":\"gpt-image-2\",\"display_name\":\"GPT Image 2\",\"type\":\"model\"}],\"probe_message\":\"\",\"probe_ok\":true,\"probe_status\":\"passed\",\"reconcile_rerun\":true,\"smoke_model_seen\":true}"}],"items_count":1,"managed_count":3,"managed_resources":[{"ID":1,"BatchID":1,"ResourceType":"group","HostResourceID":"18","ResourceName":"OpenAI 中转默认分组"},{"ID":2,"BatchID":1,"ResourceType":"channel","HostResourceID":"10","ResourceName":"OpenAI 中转默认渠道"},{"ID":3,"BatchID":1,"ResourceType":"account","HostResourceID":"20","ResourceName":"openai-zhongzhuan-01"}],"reconcile_count":1,"reconcile_runs":[{"ID":1,"ProviderID":3,"Status":"drifted","SummaryJSON":"{\"access_rechecked\":true,\"access_status\":\"broken\",\"extra_count\":11,\"host_version\":\"0.1.126\",\"missing_count\":0,\"probe_failures\":0}"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_id":1,"deleted_accounts":1,"deleted_channels":1,"deleted_groups":1,"deleted_plans":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":false,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"create","Suggested":"DeepSeek 默认渠道","ExistingID":"","Reason":""},"group":{"Action":"create","Suggested":"DeepSeek 默认分组","ExistingID":"","Reason":""},"plan":{"Action":"create","Suggested":"DeepSeek 默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"DeepSeek 默认分组","Channel":"DeepSeek 默认渠道","Plan":"DeepSeek 默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":true,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"create","Suggested":"DeepSeek 默认渠道","ExistingID":"","Reason":""},"group":{"Action":"reuse","Suggested":"DeepSeek 默认分组","ExistingID":"2","Reason":"matching managed resource already exists"},"plan":{"Action":"create","Suggested":"DeepSeek 默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"DeepSeek 默认分组","Channel":"DeepSeek 默认渠道","Plan":"DeepSeek 默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":true,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"create","Suggested":"DeepSeek 默认渠道","ExistingID":"","Reason":""},"group":{"Action":"reuse","Suggested":"DeepSeek 默认分组","ExistingID":"2","Reason":"matching managed resource already exists"},"plan":{"Action":"create","Suggested":"DeepSeek 默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"DeepSeek 默认分组","Channel":"DeepSeek 默认渠道","Plan":"DeepSeek 默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"access_status":"broken","accounts_count":0,"batch_id":4,"batch_status":"partially_succeeded","channel":{"id":"1","name":"DeepSeek 默认渠道"},"gateway":{"ok":false,"status_code":403,"models":null,"has_expected_model":false},"group":{"id":"2","name":"DeepSeek 默认分组"},"plan":null,"provider_status":"degraded"}
|
||||
@@ -0,0 +1 @@
|
||||
{"provider_id":"deepseek","mode":"self_service","available":false,"message":"access status broken does not satisfy mode self_service"}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_access_status":"broken","batch_id":4,"closures_count":1,"latest_access_status":"broken","latest_closure":{"closure_type":"self_service","details_json":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}","id":4,"status":"broken"},"pack_id":"openai-cn-pack","provider_id":"deepseek"}
|
||||
@@ -0,0 +1 @@
|
||||
{"access_closures_count":1,"batch":{"access_status":"broken","batch_status":"partially_succeeded","id":4,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18080","host_id":"http://127.0.0.1:18080","host_version":"0.1.126"},"latest_access_status":"broken","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":2,"pack":{"pack_id":"openai-cn-pack","version":"1.0.0"},"provider":{"display_name":"DeepSeek OpenAI Compatible","platform":"openai","provider_id":"deepseek"},"provider_status":"partially_succeeded","reconcile_runs_count":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":true,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"reuse","Suggested":"DeepSeek 默认渠道","ExistingID":"1","Reason":"matching managed resource already exists"},"group":{"Action":"reuse","Suggested":"DeepSeek 默认分组","ExistingID":"2","Reason":"matching managed resource already exists"},"plan":{"Action":"create","Suggested":"DeepSeek 默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"DeepSeek 默认分组","Channel":"DeepSeek 默认渠道","Plan":"DeepSeek 默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":false,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"reuse","Suggested":"DeepSeek 默认渠道","ExistingID":"1","Reason":"matching managed resource already exists"},"group":{"Action":"reuse","Suggested":"DeepSeek 默认分组","ExistingID":"2","Reason":"matching managed resource already exists"},"plan":{"Action":"create","Suggested":"DeepSeek 默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"DeepSeek 默认分组","Channel":"DeepSeek 默认渠道","Plan":"DeepSeek 默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"access_status":"broken","accounts_count":0,"batch_id":1,"batch_status":"partially_succeeded","channel":{"id":"1","name":"DeepSeek 默认渠道"},"gateway":{"ok":false,"status_code":403,"models":null,"has_expected_model":false},"group":{"id":"2","name":"DeepSeek 默认分组"},"plan":null,"provider_status":"degraded"}
|
||||
@@ -0,0 +1 @@
|
||||
{"provider_id":"deepseek","mode":"self_service","available":false,"message":"access status broken does not satisfy mode self_service"}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_access_status":"broken","batch_id":1,"closures_count":1,"latest_access_status":"broken","latest_closure":{"closure_type":"self_service","details_json":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}","id":1,"status":"broken"},"pack_id":"openai-cn-pack","provider_id":"deepseek"}
|
||||
@@ -0,0 +1 @@
|
||||
{"access_closures_count":1,"batch":{"access_status":"broken","batch_status":"partially_succeeded","id":1,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18080","host_id":"http://127.0.0.1:18080","host_version":"0.1.126"},"latest_access_status":"broken","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":2,"pack":{"pack_id":"openai-cn-pack","version":"1.0.0"},"provider":{"display_name":"DeepSeek OpenAI Compatible","platform":"openai","provider_id":"deepseek"},"provider_status":"partially_succeeded","reconcile_runs_count":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_id":1,"extra_count":4,"missing_count":0,"provider_id":"deepseek","status":"drifted","summary":{"access_rechecked":true,"access_status":"broken","extra_count":4,"host_version":"0.1.126","missing_count":0,"probe_failures":0}}
|
||||
@@ -0,0 +1 @@
|
||||
{"access_closures":[{"ID":1,"BatchID":1,"ClosureType":"self_service","Status":"broken","DetailsJSON":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}"},{"ID":2,"BatchID":1,"ClosureType":"self_service","Status":"broken","DetailsJSON":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"reconcile_rerun\":true,\"status_code\":403}"}],"access_count":2,"batch":{"access_status":"broken","batch_status":"partially_succeeded","host_id":2,"id":1,"mode":"partial","pack_id":1,"provider_id":1},"items":[],"items_count":0,"managed_count":2,"managed_resources":[{"ID":1,"BatchID":1,"ResourceType":"group","HostResourceID":"2","ResourceName":"DeepSeek 默认分组"},{"ID":2,"BatchID":1,"ResourceType":"channel","HostResourceID":"1","ResourceName":"DeepSeek 默认渠道"}],"reconcile_count":1,"reconcile_runs":[{"ID":1,"ProviderID":1,"Status":"drifted","SummaryJSON":"{\"access_rechecked\":true,\"access_status\":\"broken\",\"extra_count\":4,\"host_version\":\"0.1.126\",\"missing_count\":0,\"probe_failures\":0}"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_id":1,"deleted_accounts":0,"deleted_channels":1,"deleted_groups":1,"deleted_plans":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":false,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"create","Suggested":"DeepSeek 默认渠道","ExistingID":"","Reason":""},"group":{"Action":"create","Suggested":"DeepSeek 默认分组","ExistingID":"","Reason":""},"plan":{"Action":"create","Suggested":"DeepSeek 默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"DeepSeek 默认分组","Channel":"DeepSeek 默认渠道","Plan":"DeepSeek 默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"access_status":"broken","accounts_count":1,"batch_id":1,"batch_status":"partially_succeeded","channel":{"id":"2","name":"DeepSeek 默认渠道"},"gateway":{"ok":false,"status_code":403,"models":null,"has_expected_model":false},"group":{"id":"3","name":"DeepSeek 默认分组"},"plan":null,"provider_status":"degraded"}
|
||||
@@ -0,0 +1 @@
|
||||
{"provider_id":"deepseek","mode":"self_service","available":false,"message":"access status broken does not satisfy mode self_service"}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_access_status":"broken","batch_id":1,"closures_count":1,"latest_access_status":"broken","latest_closure":{"closure_type":"self_service","details_json":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}","id":1,"status":"broken"},"pack_id":"openai-cn-pack","provider_id":"deepseek"}
|
||||
@@ -0,0 +1 @@
|
||||
{"access_closures_count":1,"batch":{"access_status":"broken","batch_status":"partially_succeeded","id":1,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18080","host_id":"http://127.0.0.1:18080","host_version":"0.1.126"},"latest_access_status":"broken","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":3,"pack":{"pack_id":"openai-cn-pack","version":"1.0.0"},"provider":{"display_name":"DeepSeek OpenAI Compatible","platform":"openai","provider_id":"deepseek"},"provider_status":"partially_succeeded","reconcile_runs_count":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_id":1,"extra_count":5,"missing_count":0,"provider_id":"deepseek","status":"drifted","summary":{"access_rechecked":true,"access_status":"broken","extra_count":5,"host_version":"0.1.126","missing_count":0,"probe_failures":1}}
|
||||
@@ -0,0 +1 @@
|
||||
{"access_closures":[{"ID":1,"BatchID":1,"ClosureType":"self_service","Status":"broken","DetailsJSON":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}"},{"ID":2,"BatchID":1,"ClosureType":"self_service","Status":"broken","DetailsJSON":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"reconcile_rerun\":true,\"status_code\":403}"}],"access_count":2,"batch":{"access_status":"broken","batch_status":"partially_succeeded","host_id":2,"id":1,"mode":"partial","pack_id":1,"provider_id":1},"items":[{"account_status":"failed","batch_id":1,"id":1,"key_fingerprint":"sha256:555499e31601143d6c6e8dde8ee68266615cea97e4f3d1dbe9495bd070aaf8d6","probe_summary_json":"{\"account_id\":\"6\",\"models\":[{\"id\":\"gpt-5.5\",\"display_name\":\"GPT-5.5\",\"type\":\"model\"},{\"id\":\"gpt-5.4\",\"display_name\":\"GPT-5.4\",\"type\":\"model\"},{\"id\":\"gpt-5.4-mini\",\"display_name\":\"GPT-5.4 Mini\",\"type\":\"model\"},{\"id\":\"gpt-5.3-codex\",\"display_name\":\"GPT-5.3 Codex\",\"type\":\"model\"},{\"id\":\"gpt-5.3-codex-spark\",\"display_name\":\"GPT-5.3 Codex Spark\",\"type\":\"model\"},{\"id\":\"gpt-5.2\",\"display_name\":\"GPT-5.2\",\"type\":\"model\"},{\"id\":\"gpt-image-1\",\"display_name\":\"GPT Image 1\",\"type\":\"model\"},{\"id\":\"gpt-image-1.5\",\"display_name\":\"GPT Image 1.5\",\"type\":\"model\"},{\"id\":\"gpt-image-2\",\"display_name\":\"GPT Image 2\",\"type\":\"model\"}],\"probe_message\":\"\",\"probe_ok\":false,\"probe_status\":\"failed\",\"reconcile_rerun\":true,\"smoke_model_seen\":false}"}],"items_count":1,"managed_count":3,"managed_resources":[{"ID":1,"BatchID":1,"ResourceType":"group","HostResourceID":"3","ResourceName":"DeepSeek 默认分组"},{"ID":2,"BatchID":1,"ResourceType":"channel","HostResourceID":"2","ResourceName":"DeepSeek 默认渠道"},{"ID":3,"BatchID":1,"ResourceType":"account","HostResourceID":"6","ResourceName":"deepseek-01"}],"reconcile_count":1,"reconcile_runs":[{"ID":1,"ProviderID":1,"Status":"drifted","SummaryJSON":"{\"access_rechecked\":true,\"access_status\":\"broken\",\"extra_count\":5,\"host_version\":\"0.1.126\",\"missing_count\":0,\"probe_failures\":1}"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_id":1,"deleted_accounts":1,"deleted_channels":1,"deleted_groups":1,"deleted_plans":0}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"host_id":"local-sub2api","base_url":"http://127.0.0.1:18080","host_version":"0.1.126","status":"supported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":true,"account_models":true,"subscriptions":true}}
|
||||
@@ -0,0 +1 @@
|
||||
{"already_installed":false,"host_version":"0.1.126","pack_id":"openai-cn-pack","providers":[{"display_name":"DeepSeek OpenAI Compatible","provider_id":"deepseek"}],"version":"1.0.0"}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"decisions":{"channel":{"Action":"create","Suggested":"DeepSeek 默认渠道","ExistingID":"","Reason":""},"group":{"Action":"create","Suggested":"DeepSeek 默认分组","ExistingID":"","Reason":""},"plan":{"Action":"create","Suggested":"DeepSeek 默认套餐","ExistingID":"","Reason":""}},"names":{"Group":"DeepSeek 默认分组","Channel":"DeepSeek 默认渠道","Plan":"DeepSeek 默认套餐"}}
|
||||
@@ -0,0 +1 @@
|
||||
{"accepted_keys_count":1,"access_status":"broken","accounts_count":1,"batch_id":1,"batch_status":"partially_succeeded","channel":{"id":"3","name":"DeepSeek 默认渠道"},"gateway":{"ok":false,"status_code":403,"models":null,"has_expected_model":false},"group":{"id":"4","name":"DeepSeek 默认分组"},"plan":null,"provider_status":"degraded"}
|
||||
@@ -0,0 +1 @@
|
||||
{"provider_id":"deepseek","mode":"self_service","available":false,"message":"access status broken does not satisfy mode self_service"}
|
||||
@@ -0,0 +1 @@
|
||||
{"batch_access_status":"broken","batch_id":1,"closures_count":1,"latest_access_status":"broken","latest_closure":{"closure_type":"self_service","details_json":"{\"has_expected_model\":false,\"models\":null,\"ok\":false,\"status_code\":403}","id":1,"status":"broken"},"pack_id":"openai-cn-pack","provider_id":"deepseek"}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user