From 02580cda0b5922e6aa4015466580f065c6c0c754 Mon Sep 17 00:00:00 2001 From: phamnazage-jpg Date: Wed, 27 May 2026 09:39:05 +0800 Subject: [PATCH] feat: organize scripts and add portal validation assets --- .gitignore | 6 + README.md | 32 +- .../00-local-key-source.json | 1 + .../01-runtime-context.json | 16 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 0 .../00-local-key-source.json | 10 + .../01-runtime-context.json | 25 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 1 + .../05-subscription-access-prep.summary.json | 12 + .../06-subscription-access-prep.psql.txt | 5 + .../07-redis-targeted-invalidation.json | 6 + .../08-subscription-group-state.json | 28 + .../09-models.headers.txt | 9 + .../10-models.body.json | 1 + .../11-chat.headers.txt | 9 + .../12-chat.body.json | 1 + .../13-provider-status.json | 1 + .../14-access-status.json | 1 + .../15-access-preview.json | 1 + .../16-batch-detail-final.json | 1 + .../17-upstream-models.headers.txt | 20 + .../18-upstream-models.body.json | 1 + .../19-upstream-chat.headers.txt | 20 + .../20-upstream-chat.body.txt | 1 + .../21-summary.json | 1 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 25 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 1 + .../05-subscription-access-prep.summary.json | 12 + .../06-subscription-access-prep.psql.txt | 5 + .../07-redis-targeted-invalidation.json | 6 + .../08-subscription-group-state.json | 28 + .../09-models.headers.txt | 9 + .../10-models.body.json | 1 + .../11-chat.headers.txt | 10 + .../12-chat.body.json | 1 + .../13-provider-status.json | 1 + .../14-access-status.json | 1 + .../15-access-preview.json | 1 + .../16-batch-detail-final.json | 1 + .../17-upstream-models.headers.txt | 14 + .../18-upstream-models.body.json | 1 + .../19-upstream-chat.headers.txt | 12 + .../20-upstream-chat.body.txt | 1 + .../21-summary.json | 1 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 25 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 1 + .../05-subscription-access-prep.summary.json | 12 + .../06-subscription-access-prep.psql.txt | 5 + .../07-redis-targeted-invalidation.json | 6 + .../08-subscription-group-state.json | 28 + .../09-models.headers.txt | 9 + .../10-models.body.json | 1 + .../11-chat.headers.txt | 11 + .../12-chat.body.json | 1 + .../13-provider-status.json | 1 + .../14-access-status.json | 1 + .../15-access-preview.json | 1 + .../16-batch-detail-final.json | 1 + .../17-upstream-models.headers.txt | 16 + .../18-upstream-models.body.json | 1 + .../19-upstream-chat.headers.txt | 16 + .../20-upstream-chat.body.txt | 1 + .../21-summary.json | 1 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 25 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 1 + .../05-subscription-access-prep.summary.json | 12 + .../06-subscription-access-prep.psql.txt | 5 + .../07-redis-targeted-invalidation.json | 6 + .../08-subscription-group-state.json | 28 + .../09-models.headers.txt | 9 + .../10-models.body.json | 1 + .../11-chat.headers.txt | 10 + .../12-chat.body.json | 1 + .../13-provider-status.json | 1 + .../14-access-status.json | 1 + .../15-access-preview.json | 1 + .../16-batch-detail-final.json | 1 + .../17-upstream-models.headers.txt | 15 + .../18-upstream-models.body.json | 1 + .../19-upstream-chat.headers.txt | 14 + .../20-upstream-chat.body.txt | 1 + .../21-summary.json | 1 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 0 .../00-local-key-source.json | 10 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 25 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 1 + .../05-subscription-access-prep.summary.json | 12 + .../06-subscription-access-prep.psql.txt | 5 + .../07-redis-targeted-invalidation.json | 6 + .../08-subscription-group-state.json | 28 + .../09-models.headers.txt | 9 + .../10-models.body.json | 1 + .../11-chat.headers.txt | 10 + .../12-chat.body.json | 1 + .../13-provider-status.json | 1 + .../14-access-status.json | 1 + .../15-access-preview.json | 1 + .../16-batch-detail-final.json | 1 + .../17-upstream-models.headers.txt | 15 + .../18-upstream-models.body.json | 1 + .../19-upstream-chat.headers.txt | 14 + .../20-upstream-chat.body.txt | 1 + .../21-summary.json | 1 + .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../01a-create-host.json | 0 .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 0 .../00-local-key-source.json | 10 + .../01-runtime-context.json | 16 + .../01a-create-host.json | 1 + .../02-import.headers.txt | 5 + .../03-import.body.json | 1 + .../04-batch-detail-initial.json | 0 deploy/README.md | 25 + deploy/tksea-portal/index.html | 1298 +++++++++++++++++ .../nginx.sub.tksea.top.conf.example | 63 + docs/DEPLOYMENT.md | 18 + docs/EXECUTION_BOARD.md | 34 +- docs/KNOWN_LIMITATIONS.md | 2 +- docs/OPENCLAW_EXTERNAL_VALIDATION.md | 358 +++++ docs/PRODUCTION_CLOSURE_BOARD.md | 14 +- docs/PROJECT_STRUCTURE.md | 166 +++ docs/README.md | 29 +- docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md | 52 +- docs/REAL_HOST_ARTIFACT_RETENTION.md | 2 +- docs/SOURCE_OF_TRUTH.md | 2 +- .../providers/minimax-53hk.json | 31 + scripts/README.md | 40 + .../{ => acceptance}/artifact_redaction.py | 1 + .../check_deepseek_completion_split.sh | 2 + .../{ => acceptance}/host_access_prep_lib.sh | 2 + .../import_remote43_provider.sh | 16 +- .../migrate_historical_artifacts.py | 1 + .../{ => acceptance}/real_host_acceptance.sh | 4 +- scripts/{ => deploy}/build_local_image.sh | 2 +- scripts/deploy/deploy_tksea_portal.sh | 161 ++ .../remote43_patched_stack_lib.sh | 2 + .../setup_remote43_patched_stack.sh | 6 +- scripts/{ => test}/test_real_host_scripts.sh | 16 +- scripts/test/test_tksea_portal_assets.sh | 54 + 180 files changed, 3392 insertions(+), 76 deletions(-) create mode 100644 .gitignore create mode 100644 artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/05-subscription-access-prep.summary.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/06-subscription-access-prep.psql.txt create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/07-redis-targeted-invalidation.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/08-subscription-group-state.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/09-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/10-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/11-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/12-chat.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/13-provider-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/14-access-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/15-access-preview.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/16-batch-detail-final.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/17-upstream-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/18-upstream-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/19-upstream-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/20-upstream-chat.body.txt create mode 100644 artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/21-summary.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/05-subscription-access-prep.summary.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/06-subscription-access-prep.psql.txt create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/07-redis-targeted-invalidation.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/08-subscription-group-state.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/09-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/10-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/11-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/12-chat.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/13-provider-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/14-access-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/15-access-preview.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/16-batch-detail-final.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/17-upstream-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/18-upstream-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/19-upstream-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/20-upstream-chat.body.txt create mode 100644 artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/21-summary.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/05-subscription-access-prep.summary.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/06-subscription-access-prep.psql.txt create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/07-redis-targeted-invalidation.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/08-subscription-group-state.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/09-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/10-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/11-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/12-chat.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/13-provider-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/14-access-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/15-access-preview.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/16-batch-detail-final.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/17-upstream-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/18-upstream-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/19-upstream-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/20-upstream-chat.body.txt create mode 100644 artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/21-summary.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/05-subscription-access-prep.summary.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/06-subscription-access-prep.psql.txt create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/07-redis-targeted-invalidation.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/08-subscription-group-state.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/09-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/10-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/11-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/12-chat.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/13-provider-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/14-access-status.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/15-access-preview.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/16-batch-detail-final.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/17-upstream-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/18-upstream-models.body.json create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/19-upstream-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/20-upstream-chat.body.txt create mode 100644 artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/21-summary.json create mode 100644 artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260527_051447_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/05-subscription-access-prep.summary.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/06-subscription-access-prep.psql.txt create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/07-redis-targeted-invalidation.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/08-subscription-group-state.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/09-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/10-models.body.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/11-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/12-chat.body.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/13-provider-status.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/14-access-status.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/15-access-preview.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/16-batch-detail-final.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/17-upstream-models.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/18-upstream-models.body.json create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/19-upstream-chat.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/20-upstream-chat.body.txt create mode 100644 artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/21-summary.json create mode 100644 artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json create mode 100644 artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/00-local-key-source.json create mode 100644 artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01-runtime-context.json create mode 100644 artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01a-create-host.json create mode 100644 artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/02-import.headers.txt create mode 100644 artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/03-import.body.json create mode 100644 artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json create mode 100644 deploy/README.md create mode 100644 deploy/tksea-portal/index.html create mode 100644 deploy/tksea-portal/nginx.sub.tksea.top.conf.example create mode 100644 docs/OPENCLAW_EXTERNAL_VALIDATION.md create mode 100644 docs/PROJECT_STRUCTURE.md create mode 100644 packs/openai-cn-pack/providers/minimax-53hk.json create mode 100644 scripts/README.md rename scripts/{ => acceptance}/artifact_redaction.py (99%) rename scripts/{ => acceptance}/check_deepseek_completion_split.sh (98%) rename scripts/{ => acceptance}/host_access_prep_lib.sh (96%) mode change 100644 => 100755 rename scripts/{ => acceptance}/import_remote43_provider.sh (97%) rename scripts/{ => acceptance}/migrate_historical_artifacts.py (99%) rename scripts/{ => acceptance}/real_host_acceptance.sh (98%) rename scripts/{ => deploy}/build_local_image.sh (89%) create mode 100755 scripts/deploy/deploy_tksea_portal.sh rename scripts/{ => deploy}/remote43_patched_stack_lib.sh (98%) mode change 100644 => 100755 rename scripts/{ => deploy}/setup_remote43_patched_stack.sh (96%) rename scripts/{ => test}/test_real_host_scripts.sh (97%) mode change 100644 => 100755 create mode 100755 scripts/test/test_tksea_portal_assets.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..faa785dc --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.agent/ + +# Local build outputs +/bin/ +/cli +/server diff --git a/README.md b/README.md index 0a55a94f..8378bc1b 100644 --- a/README.md +++ b/README.md @@ -29,19 +29,21 @@ ```text 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 + cmd/ # CLI / server 入口 + internal/ # 控制面核心实现 + packs/ # provider packs / overlay metadata + deploy/ # 部署资产(portal 静态页、Nginx 模板) + scripts/ # deploy / acceptance / test 三层脚本 + docs/ # 真相入口、执行板、runbook、目录说明 + tests/ # 集成测试 + artifacts/ # 真实验收证据与归档 + web/ # 预留给未来管理端前端 ``` +如果你想看更细的目录职责,而不是只看一级树结构,读: + +- [docs/PROJECT_STRUCTURE.md](./docs/PROJECT_STRUCTURE.md) + ## 交付模型 本项目最终会拆成两个可独立发布的产物: @@ -70,6 +72,9 @@ sub2api-cn-relay-manager/ - [docs/PROVIDER_VALIDATION_MATRIX.md](./docs/PROVIDER_VALIDATION_MATRIX.md) —— 官方 provider 模板覆盖度、key 覆盖度、live 验收进度矩阵 - [docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md](./docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md) —— 真实宿主验收标准步骤 - [docs/REAL_HOST_ACCEPTANCE_LEARNINGS.md](./docs/REAL_HOST_ACCEPTANCE_LEARNINGS.md) —— 已调通细节、典型误判点、诊断顺序 +- [docs/OPENCLAW_EXTERNAL_VALIDATION.md](./docs/OPENCLAW_EXTERNAL_VALIDATION.md) —— OpenClaw 最后一跳真实使用验证 +- [docs/PROJECT_STRUCTURE.md](./docs/PROJECT_STRUCTURE.md) —— 当前仓库目录职责说明 +- [scripts/README.md](./scripts/README.md) —— 脚本目录分层说明与常用入口 背景/设计文档: @@ -77,6 +82,7 @@ sub2api-cn-relay-manager/ - [docs/PRD.md](./docs/PRD.md) - [docs/TDD_PLAN.md](./docs/TDD_PLAN.md) - [docs/DEPLOYMENT.md](./docs/DEPLOYMENT.md) +- [deploy/README.md](./deploy/README.md) ## 当前 MVP 能力 @@ -114,7 +120,7 @@ Docker Compose: ```bash cp .env.example .env # 编辑 .env 中的 SUB2API_CRM_ADMIN_TOKEN -scripts/build_local_image.sh +scripts/deploy/build_local_image.sh docker run --rm -p 8080:8080 \ --env-file .env \ -v "$(pwd)/data:/data" \ @@ -136,5 +142,5 @@ KEYS=sk-live-1 \ ACCESS_MODE=self_service \ ACCESS_API_KEY='' \ DRY_RUN=1 \ -scripts/real_host_acceptance.sh +scripts/acceptance/real_host_acceptance.sh ``` diff --git a/artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/00-local-key-source.json b/artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/00-local-key-source.json new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/00-local-key-source.json @@ -0,0 +1 @@ + diff --git a/artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/01-runtime-context.json b/artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/01-runtime-context.json new file mode 100644 index 00000000..8836aa99 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_154459_remote43_deepseek_multi_model_rootprep/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18173", + "host_base": "http://127.0.0.1:18169", + "crm_host_base": "http://127.0.0.1:18169", + "remote_host_base": "http://127.0.0.1:18169", + "provider_id": "deepseek", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "6d28", + "fingerprint": "dc9d99c40eb2880be824a1676a4076a4485cb14c577ed96ff6a031129d05204d" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/00-local-key-source.json b/artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/00-local-key-source.json new file mode 100644 index 00000000..9d962728 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "file:/tmp/remote43-deepseek.key", + "provider_id": "deepseek", + "redacted": { + "present": true, + "prefix": "sk-I", + "suffix": "ExDZ", + "fingerprint": "71c15291f4fa4044fdd7b80fb3b04295441122a2e0db4b9028e2e4e18919e202" + } +} diff --git a/artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/01-runtime-context.json b/artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/01-runtime-context.json new file mode 100644 index 00000000..8836aa99 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_154806_remote43_deepseek_multi_model_rootprep/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18173", + "host_base": "http://127.0.0.1:18169", + "crm_host_base": "http://127.0.0.1:18169", + "remote_host_base": "http://127.0.0.1:18169", + "provider_id": "deepseek", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "6d28", + "fingerprint": "dc9d99c40eb2880be824a1676a4076a4485cb14c577ed96ff6a031129d05204d" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/00-local-key-source.json b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/00-local-key-source.json new file mode 100644 index 00000000..9d962728 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "file:/tmp/remote43-deepseek.key", + "provider_id": "deepseek", + "redacted": { + "present": true, + "prefix": "sk-I", + "suffix": "ExDZ", + "fingerprint": "71c15291f4fa4044fdd7b80fb3b04295441122a2e0db4b9028e2e4e18919e202" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01-runtime-context.json b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01-runtime-context.json new file mode 100644 index 00000000..a994bffb --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:29173", + "host_base": "http://127.0.0.1:29169", + "crm_host_base": "http://127.0.0.1:18169", + "remote_host_base": "http://127.0.0.1:18169", + "provider_id": "deepseek", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "6d28", + "fingerprint": "dc9d99c40eb2880be824a1676a4076a4485cb14c577ed96ff6a031129d05204d" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01a-create-host.json b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01a-create-host.json new file mode 100644 index 00000000..f1ac25b2 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-kimi-patched-auto2-18169", "base_url": "http://127.0.0.1:18169", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/02-import.headers.txt b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/02-import.headers.txt new file mode 100644 index 00000000..b1b72807 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 500 Internal Server Error +Content-Type: application/json +Date: Tue, 26 May 2026 07:52:37 GMT +Content-Length: 481 + diff --git a/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/03-import.body.json b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/03-import.body.json new file mode 100644 index 00000000..f3057ec0 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":0,"access_status":"","accounts_count":0,"batch_id":0,"batch_status":"","error":{"code":"internal_error","message":"checksum file \"checksums.txt\" line 10: read \"providers/minimax-53hk.json\": open /tmp/openai-cn-pack-sub2api-kimi-patched-auto2-20260525/providers/minimax-53hk.json: no such file or directory"},"gateway":{"ok":false,"status_code":0,"models":null,"has_expected_model":false,"completion_ok":false,"completion_status":0},"provider_status":""} diff --git a/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260526_155231_remote43_deepseek_multi_model_rootprep/04-batch-detail-initial.json new file mode 100644 index 00000000..e69de29b diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/00-local-key-source.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/00-local-key-source.json new file mode 100644 index 00000000..9d962728 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "file:/tmp/remote43-deepseek.key", + "provider_id": "deepseek", + "redacted": { + "present": true, + "prefix": "sk-I", + "suffix": "ExDZ", + "fingerprint": "71c15291f4fa4044fdd7b80fb3b04295441122a2e0db4b9028e2e4e18919e202" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01-runtime-context.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01-runtime-context.json new file mode 100644 index 00000000..07961e63 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01-runtime-context.json @@ -0,0 +1,25 @@ +{ + "crm_base": "http://127.0.0.1:29173", + "host_base": "http://127.0.0.1:29169", + "crm_host_base": "http://127.0.0.1:18169", + "remote_host_base": "http://127.0.0.1:18169", + "provider_id": "deepseek", + "subscription_group_id": "3", + "import_group_id": null, + "subscription_user_id_hash": "6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918", + "managed_user_id_hash": "3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278", + "admin_user_id_hash": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", + "managed_user_email_hash": "1a9cfc1b6930c01d4e2f230724590e3a6eeeed86db08f115bcfb6758cb0a89bb", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "6d28", + "fingerprint": "dc9d99c40eb2880be824a1676a4076a4485cb14c577ed96ff6a031129d05204d" + }, + "managed_probe_key": { + "present": true, + "prefix": "sk-r", + "suffix": "9dcc", + "fingerprint": "2d02303629c6174565e98cf8a231045bb234d714078af3a1e684958218274bf8" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01a-create-host.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01a-create-host.json new file mode 100644 index 00000000..f1ac25b2 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-kimi-patched-auto2-18169", "base_url": "http://127.0.0.1:18169", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/02-import.headers.txt b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/02-import.headers.txt new file mode 100644 index 00000000..5f2da012 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Content-Type: application/json +Date: Tue, 26 May 2026 07:54:24 GMT +Content-Length: 703 + diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/03-import.body.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/03-import.body.json new file mode 100644 index 00000000..a40edc95 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":1,"access_status":"broken","accounts_count":1,"batch_id":30,"batch_status":"partially_succeeded","channel":{"id":"2","name":"DeepSeek 默认渠道-subscription"},"gateway":{"ok":true,"status_code":200,"models":["deepseek-v4-flash","deepseek-v4-pro"],"has_expected_model":true,"completion_ok":false,"completion_status":502,"completion_content_type":"application/json; charset=utf-8","completion_body_preview":"{\"error\":{\"message\":\"Upstream access forbidden, please contact administrator\",\"type\":\"upstream_error\"}}"},"group":{"id":"3","name":"DeepSeek 默认分组-subscription"},"plan":{"id":"2","name":"DeepSeek 默认套餐-subscription"},"provider_status":"degraded"} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/04-batch-detail-initial.json new file mode 100644 index 00000000..0d390351 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/04-batch-detail-initial.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":31,"BatchID":30,"ClosureType":"subscription","Status":"broken","DetailsJSON":"{\"completion_ok\":false,\"completion_preview\":\"{\\\"error\\\":{\\\"message\\\":\\\"Upstream access forbidden, please contact administrator\\\",\\\"type\\\":\\\"upstream_error\\\"}}\",\"completion_status\":502,\"completion_type\":\"application/json; charset=utf-8\",\"effective_probe_key_fingerprint\":\"sha256:2d02303629c6174565e98cf8a231045bb234d714078af3a1e684958218274bf8\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-v4-flash\",\"deepseek-v4-pro\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779781506-73d36d28\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"12\"]}"}],"access_count":1,"batch":{"access_status":"broken","batch_status":"partially_succeeded","host_id":3,"id":30,"mode":"partial","pack_id":1,"provider_id":1},"items":[{"account_status":"failed","batch_id":30,"id":26,"key_fingerprint":"sha256:71c15291f4fa4044fdd7b80fb3b04295441122a2e0db4b9028e2e4e18919e202","probe_summary_json":"{\"account_id\":\"4\",\"models\":[{\"id\":\"deepseek-v4-pro\",\"display_name\":\"deepseek-v4-pro\",\"type\":\"model\"},{\"id\":\"deepseek-v4-flash\",\"display_name\":\"deepseek-v4-flash\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"API returned 403: {\\\"error\\\":{\\\"code\\\":\\\"\\\",\\\"message\\\":\\\"无权访问 Deepseek用户 分组 (request id: 202605260754235867004308268d9d6YGFnfKuB)\\\",\\\"type\\\":\\\"new_api_error\\\"}}\",\"probe_ok\":false,\"probe_status\":\"failed\",\"smoke_model_seen\":true,\"validation_status\":\"failed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":58,"BatchID":30,"HostID":3,"ResourceType":"group","HostResourceID":"3","ResourceName":"DeepSeek 默认分组-subscription"},{"ID":59,"BatchID":30,"HostID":3,"ResourceType":"channel","HostResourceID":"2","ResourceName":"DeepSeek 默认渠道-subscription"},{"ID":60,"BatchID":30,"HostID":3,"ResourceType":"plan","HostResourceID":"2","ResourceName":"DeepSeek 默认套餐-subscription"},{"ID":61,"BatchID":30,"HostID":3,"ResourceType":"account","HostResourceID":"4","ResourceName":"deepseek-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/05-subscription-access-prep.summary.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/05-subscription-access-prep.summary.json new file mode 100644 index 00000000..e17515d9 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/05-subscription-access-prep.summary.json @@ -0,0 +1,12 @@ +{ + "subscription_user_id_hash": "6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918", + "subscription_group_id": 3, + "min_balance": 10, + "subscription_days": 30, + "api_key": { + "present": true, + "prefix": "sk-1", + "suffix": "6d28", + "fingerprint": "dc9d99c40eb2880be824a1676a4076a4485cb14c577ed96ff6a031129d05204d" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/06-subscription-access-prep.psql.txt b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/06-subscription-access-prep.psql.txt new file mode 100644 index 00000000..894b2e3a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/06-subscription-access-prep.psql.txt @@ -0,0 +1,5 @@ +BEGIN +UPDATE 1 +UPDATE 1 +INSERT 0 1 +COMMIT diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/07-redis-targeted-invalidation.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/07-redis-targeted-invalidation.json new file mode 100644 index 00000000..85a0578a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/07-redis-targeted-invalidation.json @@ -0,0 +1,6 @@ +{ + "auth_cache_invalidated": true, + "balance_cache_invalidated": true, + "subscription_cache_invalidated": true, + "redis_del_exit_code": 0 +} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/08-subscription-group-state.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/08-subscription-group-state.json new file mode 100644 index 00000000..fa95e5eb --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/08-subscription-group-state.json @@ -0,0 +1,28 @@ +{ + "group_id": 3, + "group": { + "id": 3, + "name": "DeepSeek 默认分组-subscription", + "type": null, + "subscription_type": "subscription" + }, + "subscription": { + "id": 11, + "user_id_hash": "3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278", + "group_id": 3, + "status": "active", + "starts_at": "2026-05-26T07:54:23.810135+00:00", + "expires_at": "2026-06-25T07:54:23.810135+00:00" + }, + "key": { + "id": 12, + "group_id": 3, + "status": "active", + "redacted": { + "present": true, + "prefix": "sk-r", + "suffix": "9dcc", + "fingerprint": "2d02303629c6174565e98cf8a231045bb234d714078af3a1e684958218274bf8" + } + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/09-models.headers.txt b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/09-models.headers.txt new file mode 100644 index 00000000..79fc0559 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/09-models.headers.txt @@ -0,0 +1,9 @@ +HTTP/1.1 200 OK +Content-Type: application/json; charset=utf-8 +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: 21961b24-02a3-42db-8f4d-6bde5f308c98 +Date: Tue, 26 May 2026 07:54:30 GMT +Content-Length: 248 + diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/10-models.body.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/10-models.body.json new file mode 100644 index 00000000..eb1aa93c --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/10-models.body.json @@ -0,0 +1 @@ +{"data":[{"id":"deepseek-v4-flash","type":"model","display_name":"deepseek-v4-flash","created_at":"2024-01-01T00:00:00Z"},{"id":"deepseek-v4-pro","type":"model","display_name":"deepseek-v4-pro","created_at":"2024-01-01T00:00:00Z"}],"object":"list"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/11-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/11-chat.headers.txt new file mode 100644 index 00000000..045dd5ca --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/11-chat.headers.txt @@ -0,0 +1,9 @@ +HTTP/1.1 503 Service Unavailable +Content-Type: application/json; charset=utf-8 +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: fde2e263-5d82-42de-9246-fe9e8ea81d18 +Date: Tue, 26 May 2026 07:54:33 GMT +Content-Length: 74 + diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/12-chat.body.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/12-chat.body.json new file mode 100644 index 00000000..6da31f0d --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/12-chat.body.json @@ -0,0 +1 @@ +{"error":{"message":"Service temporarily unavailable","type":"api_error"}} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/13-provider-status.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/13-provider-status.json new file mode 100644 index 00000000..b35d270d --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/13-provider-status.json @@ -0,0 +1 @@ +{"access_closures_count":1,"batch":{"access_status":"broken","batch_status":"partially_succeeded","id":30,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18169","host_id":"remote43-kimi-patched-auto2-18169","host_version":"0.1.126"},"latest_access_status":"broken","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":4,"pack":{"pack_id":"openai-cn-pack","version":"1.1.4"},"provider":{"display_name":"DeepSeek OpenAI Compatible","platform":"openai","provider_id":"deepseek"},"provider_status":"partially_succeeded","reconcile_runs_count":0} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/14-access-status.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/14-access-status.json new file mode 100644 index 00000000..01f612b9 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/14-access-status.json @@ -0,0 +1 @@ +{"batch_access_status":"broken","batch_id":30,"closures_count":1,"latest_access_status":"broken","latest_closure":{"closure_type":"subscription","details_json":"{\"completion_ok\":false,\"completion_preview\":\"{\\\"error\\\":{\\\"message\\\":\\\"Upstream access forbidden, please contact administrator\\\",\\\"type\\\":\\\"upstream_error\\\"}}\",\"completion_status\":502,\"completion_type\":\"application/json; charset=utf-8\",\"effective_probe_key_fingerprint\":\"sha256:2d02303629c6174565e98cf8a231045bb234d714078af3a1e684958218274bf8\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-v4-flash\",\"deepseek-v4-pro\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779781506-73d36d28\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"12\"]}","id":31,"status":"broken"},"pack_id":"openai-cn-pack","provider_id":"deepseek"} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/15-access-preview.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/15-access-preview.json new file mode 100644 index 00000000..2630ae1a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/15-access-preview.json @@ -0,0 +1 @@ +{"provider_id":"deepseek","mode":"subscription","available":false,"message":"access status broken does not satisfy mode subscription"} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/16-batch-detail-final.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/16-batch-detail-final.json new file mode 100644 index 00000000..0d390351 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/16-batch-detail-final.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":31,"BatchID":30,"ClosureType":"subscription","Status":"broken","DetailsJSON":"{\"completion_ok\":false,\"completion_preview\":\"{\\\"error\\\":{\\\"message\\\":\\\"Upstream access forbidden, please contact administrator\\\",\\\"type\\\":\\\"upstream_error\\\"}}\",\"completion_status\":502,\"completion_type\":\"application/json; charset=utf-8\",\"effective_probe_key_fingerprint\":\"sha256:2d02303629c6174565e98cf8a231045bb234d714078af3a1e684958218274bf8\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-v4-flash\",\"deepseek-v4-pro\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779781506-73d36d28\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"12\"]}"}],"access_count":1,"batch":{"access_status":"broken","batch_status":"partially_succeeded","host_id":3,"id":30,"mode":"partial","pack_id":1,"provider_id":1},"items":[{"account_status":"failed","batch_id":30,"id":26,"key_fingerprint":"sha256:71c15291f4fa4044fdd7b80fb3b04295441122a2e0db4b9028e2e4e18919e202","probe_summary_json":"{\"account_id\":\"4\",\"models\":[{\"id\":\"deepseek-v4-pro\",\"display_name\":\"deepseek-v4-pro\",\"type\":\"model\"},{\"id\":\"deepseek-v4-flash\",\"display_name\":\"deepseek-v4-flash\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"API returned 403: {\\\"error\\\":{\\\"code\\\":\\\"\\\",\\\"message\\\":\\\"无权访问 Deepseek用户 分组 (request id: 202605260754235867004308268d9d6YGFnfKuB)\\\",\\\"type\\\":\\\"new_api_error\\\"}}\",\"probe_ok\":false,\"probe_status\":\"failed\",\"smoke_model_seen\":true,\"validation_status\":\"failed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":58,"BatchID":30,"HostID":3,"ResourceType":"group","HostResourceID":"3","ResourceName":"DeepSeek 默认分组-subscription"},{"ID":59,"BatchID":30,"HostID":3,"ResourceType":"channel","HostResourceID":"2","ResourceName":"DeepSeek 默认渠道-subscription"},{"ID":60,"BatchID":30,"HostID":3,"ResourceType":"plan","HostResourceID":"2","ResourceName":"DeepSeek 默认套餐-subscription"},{"ID":61,"BatchID":30,"HostID":3,"ResourceType":"account","HostResourceID":"4","ResourceName":"deepseek-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/17-upstream-models.headers.txt b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/17-upstream-models.headers.txt new file mode 100644 index 00000000..610da072 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/17-upstream-models.headers.txt @@ -0,0 +1,20 @@ +HTTP/1.1 403 Forbidden +Server: Tengine +Content-Type: application/json; charset=utf-8 +Content-Length: 145 +Connection: keep-alive +Access-Control-Allow-Headers: * +Access-Control-Allow-Methods: POST,GET,PUT,OPTIONS,DELETE +Access-Control-Allow-Origin: * +Date: Tue, 26 May 2026 07:54:37 GMT +X-New-Api-Version: v0.0.0 +X-Oneapi-Request-Id: 202605260754377650427838268d9d645joSSum +Via: ens-cache41.l2cn7147[292,292,403-1280,M], ens-cache60.l2cn7147[294,0], kunlun7.cn192[405,405,403-1280,M], kunlun9.cn192[409,0] +Ali-Swift-Global-Savetime: 1779782077 +X-Cache: MISS TCP_MISS dirn:-2:-2 +X-Swift-Error: orig response 4XX error +X-Swift-SaveTime: Tue, 26 May 2026 07:54:37 GMT +X-Swift-CacheTime: 0 +Timing-Allow-Origin: * +EagleId: 3adad01d17797820773931363e + diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/18-upstream-models.body.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/18-upstream-models.body.json new file mode 100644 index 00000000..95d54ec2 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/18-upstream-models.body.json @@ -0,0 +1 @@ +{"error":{"code":"","message":"无权访问 Deepseek用户 分组 (request id: 202605260754377650427838268d9d645joSSum)","type":"new_api_error"}} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/19-upstream-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/19-upstream-chat.headers.txt new file mode 100644 index 00000000..ec4a42fd --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/19-upstream-chat.headers.txt @@ -0,0 +1,20 @@ +HTTP/1.1 403 Forbidden +Server: Tengine +Content-Type: application/json; charset=utf-8 +Content-Length: 145 +Connection: keep-alive +Access-Control-Allow-Headers: * +Access-Control-Allow-Methods: POST,GET,PUT,OPTIONS,DELETE +Access-Control-Allow-Origin: * +Date: Tue, 26 May 2026 07:54:41 GMT +X-New-Api-Version: v0.0.0 +X-Oneapi-Request-Id: 202605260754414466898358268d9d6Z6cMKV6A +Via: cache66.l2cn8786[170,169,403-1280,M], cache66.l2cn8786[171,0], kunlun5.cn192[219,219,403-1280,M], kunlun5.cn192[223,0] +Ali-Swift-Global-Savetime: 1779782081 +X-Cache: MISS TCP_MISS dirn:-2:-2 +X-Swift-Error: orig response 4XX error +X-Swift-SaveTime: Tue, 26 May 2026 07:54:41 GMT +X-Swift-CacheTime: 0 +Timing-Allow-Origin: * +EagleId: 3adad01917797820812578708e + diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/20-upstream-chat.body.txt b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/20-upstream-chat.body.txt new file mode 100644 index 00000000..61d03e18 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/20-upstream-chat.body.txt @@ -0,0 +1 @@ +{"error":{"code":"","message":"无权访问 Deepseek用户 分组 (request id: 202605260754414466898358268d9d6Z6cMKV6A)","type":"new_api_error"}} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/21-summary.json b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/21-summary.json new file mode 100644 index 00000000..cacb7e2b --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep/21-summary.json @@ -0,0 +1 @@ +{"artifact_dir": "/home/long/project/sub2api-cn-relay-manager/artifacts/real-host-acceptance/20260526_155416_remote43_deepseek_multi_model_rootprep", "provider_id": "deepseek", "batch_id": 30, "batch_status": "partially_succeeded", "access_status_from_import": "broken", "provider_status_from_import": "degraded", "direct_models_http200": true, "direct_models_has_expected_model": true, "direct_models": ["deepseek-v4-flash", "deepseek-v4-pro"], "direct_chat_http200": false, "direct_chat_status": 503, "upstream_models": [], "upstream_models_has_expected_model": false, "upstream_chat_status": 403, "completion_classification": "unknown", "latest_access_status": "broken", "preview_available": false, "accepted_keys_count": 1, "subscription_group_id": "3", "import_group_id": "3"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/00-local-key-source.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/00-local-key-source.json new file mode 100644 index 00000000..e7417458 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "file:/tmp/remote43-asxs.key", + "provider_id": "openai-zhongzhuan", + "redacted": { + "present": true, + "prefix": "sk-6", + "suffix": "ec41", + "fingerprint": "fbd0fe64bde9bf5e4fbc1b648540139ae34473dbdd07905a72b1e90970bddce5" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01-runtime-context.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01-runtime-context.json new file mode 100644 index 00000000..c9c63c0e --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01-runtime-context.json @@ -0,0 +1,25 @@ +{ + "crm_base": "http://127.0.0.1:29273", + "host_base": "http://127.0.0.1:29269", + "crm_host_base": "http://127.0.0.1:18169", + "remote_host_base": "http://127.0.0.1:18169", + "provider_id": "openai-zhongzhuan", + "subscription_group_id": "4", + "import_group_id": null, + "subscription_user_id_hash": "8527a891e224136950ff32ca212b45bc93f69fbb801c3b1ebedac52775f99e61", + "managed_user_id_hash": "e629fa6598d732768f7c726b4b621285f9c3b85303900aa912017db7617d8bdb", + "admin_user_id_hash": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", + "managed_user_email_hash": "9ce0346635b0976a1871e047161d6c128308ebc2bea6789f883836bc6df1bede", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "e6af", + "fingerprint": "0fb5417398a5757d4eeb9a7c515eedbb7cb7a89dd20dc266f7a554d622099c8b" + }, + "managed_probe_key": { + "present": true, + "prefix": "sk-r", + "suffix": "6637", + "fingerprint": "b5d87fceba691646a767d878d393dcf6ce052989d9d9b941a4a651021901e56a" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01a-create-host.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01a-create-host.json new file mode 100644 index 00000000..f1ac25b2 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-kimi-patched-auto2-18169", "base_url": "http://127.0.0.1:18169", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/02-import.headers.txt b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/02-import.headers.txt new file mode 100644 index 00000000..a443050e --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Content-Type: application/json +Date: Tue, 26 May 2026 07:56:13 GMT +Content-Length: 910 + diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/03-import.body.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/03-import.body.json new file mode 100644 index 00000000..48c505bf --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":1,"access_status":"subscription_ready","accounts_count":1,"batch_id":31,"batch_status":"succeeded","channel":{"id":"3","name":"OpenAI 中转默认渠道-subscription"},"gateway":{"ok":true,"status_code":200,"models":["gpt-5.4","gpt-5.4-mini"],"has_expected_model":true,"completion_ok":true,"completion_status":200,"completion_content_type":"text/event-stream","completion_body_preview":"{\"id\":\"resp_05b7fb3e1487bec5016a15521685b4819180c5d8163c05dd5f\",\"object\":\"chat.completion\",\"created\":1779782173,\"model\":\"gpt-5.4\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"pong\"},\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":349,\"completion_tokens\":5,\"total_tokens\":354}}"},"group":{"id":"4","name":"OpenAI 中转默认分组-subscription"},"plan":{"id":"3","name":"OpenAI 中转默认套餐-subscription"},"provider_status":"active"} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/04-batch-detail-initial.json new file mode 100644 index 00000000..0e3c39e8 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/04-batch-detail-initial.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":32,"BatchID":31,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"resp_05b7fb3e1487bec5016a15521685b4819180c5d8163c05dd5f\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782173,\\\"model\\\":\\\"gpt-5.4\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"pong\\\"},\\\"finish_reason\\\":\\\"stop\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":349,\\\"completion_tokens\\\":5,\\\"total_tokens\\\":354}}\",\"completion_status\":200,\"completion_type\":\"text/event-stream\",\"effective_probe_key_fingerprint\":\"sha256:b5d87fceba691646a767d878d393dcf6ce052989d9d9b941a4a651021901e56a\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"gpt-5.4\",\"gpt-5.4-mini\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782154-ea91e6af\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"14\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"succeeded","host_id":3,"id":31,"mode":"partial","pack_id":1,"provider_id":3},"items":[{"account_status":"passed","batch_id":31,"id":27,"key_fingerprint":"sha256:fbd0fe64bde9bf5e4fbc1b648540139ae34473dbdd07905a72b1e90970bddce5","probe_summary_json":"{\"account_id\":\"5\",\"models\":[{\"id\":\"gpt-5.4-mini\",\"display_name\":\"GPT-5.4 Mini\",\"type\":\"model\"},{\"id\":\"gpt-5.4\",\"display_name\":\"GPT-5.4\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"\",\"probe_ok\":true,\"probe_status\":\"passed\",\"smoke_model_seen\":true,\"validation_status\":\"passed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":62,"BatchID":31,"HostID":3,"ResourceType":"group","HostResourceID":"4","ResourceName":"OpenAI 中转默认分组-subscription"},{"ID":63,"BatchID":31,"HostID":3,"ResourceType":"channel","HostResourceID":"3","ResourceName":"OpenAI 中转默认渠道-subscription"},{"ID":64,"BatchID":31,"HostID":3,"ResourceType":"plan","HostResourceID":"3","ResourceName":"OpenAI 中转默认套餐-subscription"},{"ID":65,"BatchID":31,"HostID":3,"ResourceType":"account","HostResourceID":"5","ResourceName":"openai-zhongzhuan-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/05-subscription-access-prep.summary.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/05-subscription-access-prep.summary.json new file mode 100644 index 00000000..260de352 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/05-subscription-access-prep.summary.json @@ -0,0 +1,12 @@ +{ + "subscription_user_id_hash": "8527a891e224136950ff32ca212b45bc93f69fbb801c3b1ebedac52775f99e61", + "subscription_group_id": 4, + "min_balance": 10, + "subscription_days": 30, + "api_key": { + "present": true, + "prefix": "sk-1", + "suffix": "e6af", + "fingerprint": "0fb5417398a5757d4eeb9a7c515eedbb7cb7a89dd20dc266f7a554d622099c8b" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/06-subscription-access-prep.psql.txt b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/06-subscription-access-prep.psql.txt new file mode 100644 index 00000000..894b2e3a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/06-subscription-access-prep.psql.txt @@ -0,0 +1,5 @@ +BEGIN +UPDATE 1 +UPDATE 1 +INSERT 0 1 +COMMIT diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/07-redis-targeted-invalidation.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/07-redis-targeted-invalidation.json new file mode 100644 index 00000000..85a0578a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/07-redis-targeted-invalidation.json @@ -0,0 +1,6 @@ +{ + "auth_cache_invalidated": true, + "balance_cache_invalidated": true, + "subscription_cache_invalidated": true, + "redis_del_exit_code": 0 +} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/08-subscription-group-state.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/08-subscription-group-state.json new file mode 100644 index 00000000..ee85d6ba --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/08-subscription-group-state.json @@ -0,0 +1,28 @@ +{ + "group_id": 4, + "group": { + "id": 4, + "name": "OpenAI 中转默认分组-subscription", + "type": null, + "subscription_type": "subscription" + }, + "subscription": { + "id": 13, + "user_id_hash": "e629fa6598d732768f7c726b4b621285f9c3b85303900aa912017db7617d8bdb", + "group_id": 4, + "status": "active", + "starts_at": "2026-05-26T07:56:04.392454+00:00", + "expires_at": "2026-06-25T07:56:04.392454+00:00" + }, + "key": { + "id": 14, + "group_id": 4, + "status": "active", + "redacted": { + "present": true, + "prefix": "sk-r", + "suffix": "6637", + "fingerprint": "b5d87fceba691646a767d878d393dcf6ce052989d9d9b941a4a651021901e56a" + } + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/09-models.headers.txt b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/09-models.headers.txt new file mode 100644 index 00000000..1852fd95 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/09-models.headers.txt @@ -0,0 +1,9 @@ +HTTP/1.1 200 OK +Content-Type: application/json; charset=utf-8 +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: 801feba4-3d88-4191-b838-972fd6a6ed0d +Date: Tue, 26 May 2026 07:56:19 GMT +Content-Length: 222 + diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/10-models.body.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/10-models.body.json new file mode 100644 index 00000000..d4392338 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/10-models.body.json @@ -0,0 +1 @@ +{"data":[{"id":"gpt-5.4","type":"model","display_name":"gpt-5.4","created_at":"2024-01-01T00:00:00Z"},{"id":"gpt-5.4-mini","type":"model","display_name":"gpt-5.4-mini","created_at":"2024-01-01T00:00:00Z"}],"object":"list"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/11-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/11-chat.headers.txt new file mode 100644 index 00000000..c1a13e37 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/11-chat.headers.txt @@ -0,0 +1,10 @@ +HTTP/1.1 200 OK +Cache-Control: no-cache +Content-Type: text/event-stream +Date: Tue, 26 May 2026 07:56:22 GMT +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: e33c8294-b6d9-4340-9934-e2983eebdf80 +Content-Length: 296 + diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/12-chat.body.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/12-chat.body.json new file mode 100644 index 00000000..a8f68257 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/12-chat.body.json @@ -0,0 +1 @@ +{"id":"resp_0c6f5f48d097bafc016a1552268ffc81919b059615316714d0","object":"chat.completion","created":1779782191,"model":"gpt-5.4","choices":[{"index":0,"message":{"role":"assistant","content":"pong"},"finish_reason":"stop"}],"usage":{"prompt_tokens":349,"completion_tokens":5,"total_tokens":354}} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/13-provider-status.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/13-provider-status.json new file mode 100644 index 00000000..1f3957bc --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/13-provider-status.json @@ -0,0 +1 @@ +{"access_closures_count":1,"batch":{"access_status":"subscription_ready","batch_status":"succeeded","id":31,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18169","host_id":"remote43-kimi-patched-auto2-18169","host_version":"0.1.126"},"latest_access_status":"subscription_ready","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":4,"pack":{"pack_id":"openai-cn-pack","version":"1.1.4"},"provider":{"display_name":"OpenAI 中转兼容","platform":"openai","provider_id":"openai-zhongzhuan"},"provider_status":"active","reconcile_runs_count":0} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/14-access-status.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/14-access-status.json new file mode 100644 index 00000000..02b7b36e --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/14-access-status.json @@ -0,0 +1 @@ +{"batch_access_status":"subscription_ready","batch_id":31,"closures_count":1,"latest_access_status":"subscription_ready","latest_closure":{"closure_type":"subscription","details_json":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"resp_05b7fb3e1487bec5016a15521685b4819180c5d8163c05dd5f\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782173,\\\"model\\\":\\\"gpt-5.4\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"pong\\\"},\\\"finish_reason\\\":\\\"stop\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":349,\\\"completion_tokens\\\":5,\\\"total_tokens\\\":354}}\",\"completion_status\":200,\"completion_type\":\"text/event-stream\",\"effective_probe_key_fingerprint\":\"sha256:b5d87fceba691646a767d878d393dcf6ce052989d9d9b941a4a651021901e56a\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"gpt-5.4\",\"gpt-5.4-mini\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782154-ea91e6af\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"14\"]}","id":32,"status":"subscription_ready"},"pack_id":"openai-cn-pack","provider_id":"openai-zhongzhuan"} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/15-access-preview.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/15-access-preview.json new file mode 100644 index 00000000..6ec6c2f1 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/15-access-preview.json @@ -0,0 +1 @@ +{"provider_id":"openai-zhongzhuan","mode":"subscription","available":true,"message":"latest access status: subscription_ready"} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/16-batch-detail-final.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/16-batch-detail-final.json new file mode 100644 index 00000000..0e3c39e8 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/16-batch-detail-final.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":32,"BatchID":31,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"resp_05b7fb3e1487bec5016a15521685b4819180c5d8163c05dd5f\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782173,\\\"model\\\":\\\"gpt-5.4\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"pong\\\"},\\\"finish_reason\\\":\\\"stop\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":349,\\\"completion_tokens\\\":5,\\\"total_tokens\\\":354}}\",\"completion_status\":200,\"completion_type\":\"text/event-stream\",\"effective_probe_key_fingerprint\":\"sha256:b5d87fceba691646a767d878d393dcf6ce052989d9d9b941a4a651021901e56a\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"gpt-5.4\",\"gpt-5.4-mini\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782154-ea91e6af\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"14\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"succeeded","host_id":3,"id":31,"mode":"partial","pack_id":1,"provider_id":3},"items":[{"account_status":"passed","batch_id":31,"id":27,"key_fingerprint":"sha256:fbd0fe64bde9bf5e4fbc1b648540139ae34473dbdd07905a72b1e90970bddce5","probe_summary_json":"{\"account_id\":\"5\",\"models\":[{\"id\":\"gpt-5.4-mini\",\"display_name\":\"GPT-5.4 Mini\",\"type\":\"model\"},{\"id\":\"gpt-5.4\",\"display_name\":\"GPT-5.4\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"\",\"probe_ok\":true,\"probe_status\":\"passed\",\"smoke_model_seen\":true,\"validation_status\":\"passed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":62,"BatchID":31,"HostID":3,"ResourceType":"group","HostResourceID":"4","ResourceName":"OpenAI 中转默认分组-subscription"},{"ID":63,"BatchID":31,"HostID":3,"ResourceType":"channel","HostResourceID":"3","ResourceName":"OpenAI 中转默认渠道-subscription"},{"ID":64,"BatchID":31,"HostID":3,"ResourceType":"plan","HostResourceID":"3","ResourceName":"OpenAI 中转默认套餐-subscription"},{"ID":65,"BatchID":31,"HostID":3,"ResourceType":"account","HostResourceID":"5","ResourceName":"openai-zhongzhuan-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/17-upstream-models.headers.txt b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/17-upstream-models.headers.txt new file mode 100644 index 00000000..6bc35fee --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/17-upstream-models.headers.txt @@ -0,0 +1,14 @@ +HTTP/2 200 +date: Tue, 26 May 2026 07:56:34 GMT +content-type: application/json; charset=utf-8 +content-length: 429 +server: cloudflare +strict-transport-security: max-age=63072000;includeSubDomains; preload +x-served-by: api.asxs.top +cf-cache-status: DYNAMIC +speculation-rules: "/cdn-cgi/speculation" +report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=CsU9azoVem4gguQKQtZA6C3%2FDeOzvTn8Qkzs178u5uZtv%2F01G%2Bxk2Tf8VE40fVeth4eIF98gn%2BjsjR3AliiZG6NaxKoKsdCUZQgOfiFKIRHDc6ku4cSXgCKmQnqKWA%3D%3D"}]} +nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800} +cf-ray: a01b395a4f4dea8b-ICN +alt-svc: h3=":443"; ma=86400 + diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/18-upstream-models.body.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/18-upstream-models.body.json new file mode 100644 index 00000000..63a3fd67 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/18-upstream-models.body.json @@ -0,0 +1 @@ +{"data":[{"id":"gpt-5.2","object":"model","owned_by":"openai"},{"id":"gpt-5.3-codex","object":"model","owned_by":"openai"},{"id":"gpt-5.4","object":"model","owned_by":"openai"},{"id":"gpt-5.4-mini","object":"model","owned_by":"openai"},{"id":"gpt-5.5","object":"model","owned_by":"openai"},{"id":"codex-auto-review","object":"model","owned_by":"openai"},{"id":"gpt-image-2","object":"model","owned_by":"openai"}],"object":"list"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/19-upstream-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/19-upstream-chat.headers.txt new file mode 100644 index 00000000..079f3a06 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/19-upstream-chat.headers.txt @@ -0,0 +1,12 @@ +HTTP/2 502 +date: Tue, 26 May 2026 07:56:37 GMT +content-type: text/plain; charset=UTF-8 +content-length: 15 +cache-control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 +expires: Thu, 01 Jan 1970 00:00:01 GMT +referrer-policy: same-origin +x-frame-options: SAMEORIGIN +server: cloudflare +cf-ray: a01b396daeecdf70-ICN +alt-svc: h3=":443"; ma=86400 + diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/20-upstream-chat.body.txt b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/20-upstream-chat.body.txt new file mode 100644 index 00000000..322c1fe1 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/20-upstream-chat.body.txt @@ -0,0 +1 @@ +error code: 502 \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/21-summary.json b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/21-summary.json new file mode 100644 index 00000000..347996ea --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep/21-summary.json @@ -0,0 +1 @@ +{"artifact_dir": "/home/long/project/sub2api-cn-relay-manager/artifacts/real-host-acceptance/20260526_155548_remote43_openai_zhongzhuan_multi_model_rootprep", "provider_id": "openai-zhongzhuan", "batch_id": 31, "batch_status": "succeeded", "access_status_from_import": "subscription_ready", "provider_status_from_import": "active", "direct_models_http200": true, "direct_models_has_expected_model": true, "direct_models": ["gpt-5.4", "gpt-5.4-mini"], "direct_chat_http200": true, "direct_chat_status": 200, "upstream_models": ["gpt-5.2", "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", "gpt-5.5", "codex-auto-review", "gpt-image-2"], "upstream_models_has_expected_model": true, "upstream_chat_status": 502, "completion_classification": "unknown", "latest_access_status": "subscription_ready", "preview_available": true, "accepted_keys_count": 1, "subscription_group_id": "4", "import_group_id": "4"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/00-local-key-source.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/00-local-key-source.json new file mode 100644 index 00000000..5b5e2520 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "file:/tmp/remote43-minimax53hk.key", + "provider_id": "minimax-53hk", + "redacted": { + "present": true, + "prefix": "sk-4", + "suffix": "d776", + "fingerprint": "3285f7116ec262d059c83dbdaf041eb7fcf6d04e2abdacbbff94891648beaccd" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01-runtime-context.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01-runtime-context.json new file mode 100644 index 00000000..ca19263b --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01-runtime-context.json @@ -0,0 +1,25 @@ +{ + "crm_base": "http://127.0.0.1:29373", + "host_base": "http://127.0.0.1:29369", + "crm_host_base": "http://127.0.0.1:18169", + "remote_host_base": "http://127.0.0.1:18169", + "provider_id": "minimax-53hk", + "subscription_group_id": "5", + "import_group_id": null, + "subscription_user_id_hash": "b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9", + "managed_user_id_hash": "4523540f1504cd17100c4835e85b7eefd49911580f8efff0599a8f283be6b9e3", + "admin_user_id_hash": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", + "managed_user_email_hash": "176ec5ab412c9f5d92367c536e8433e51ed59f770127171b199da6da25d47250", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "68c5", + "fingerprint": "e885c4cfe8698c77c08d8534175c42aea41996d8bdb6f42e0871c846505ef4b4" + }, + "managed_probe_key": { + "present": true, + "prefix": "sk-r", + "suffix": "8583", + "fingerprint": "db2c7532705c64379db087705dd0659a5ccf230f83af1d6168ad85d4e3650719" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01a-create-host.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01a-create-host.json new file mode 100644 index 00000000..f1ac25b2 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-kimi-patched-auto2-18169", "base_url": "http://127.0.0.1:18169", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/02-import.headers.txt b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/02-import.headers.txt new file mode 100644 index 00000000..b23e2c73 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Content-Type: application/json +Date: Tue, 26 May 2026 07:57:17 GMT +Content-Length: 1038 + diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/03-import.body.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/03-import.body.json new file mode 100644 index 00000000..a836500c --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":1,"access_status":"subscription_ready","accounts_count":1,"batch_id":32,"batch_status":"succeeded","channel":{"id":"4","name":"MiniMax 53hk 默认渠道-subscription"},"gateway":{"ok":true,"status_code":200,"models":["MiniMax-M2.5-highspeed","MiniMax-M2.7-highspeed"],"has_expected_model":true,"completion_ok":true,"completion_status":200,"completion_content_type":"text/event-stream","completion_body_preview":"{\"id\":\"0664855a28dd148f45976c5f50bb3a6e\",\"object\":\"chat.completion\",\"created\":1779782237,\"model\":\"MiniMax-M2.7-highspeed\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"Pong!\",\"reasoning_content\":\"The user says \\\"ping\\\". This is a simple request, likely a test to see if the model is responding. So we can respond with \\\"pong\\\" or something like that. According to instructions, the a"},"group":{"id":"5","name":"MiniMax 53hk 默认分组-subscription"},"plan":{"id":"4","name":"MiniMax 53hk 默认套餐-subscription"},"provider_status":"active"} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/04-batch-detail-initial.json new file mode 100644 index 00000000..b2262481 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/04-batch-detail-initial.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":33,"BatchID":32,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"0664855a28dd148f45976c5f50bb3a6e\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782237,\\\"model\\\":\\\"MiniMax-M2.7-highspeed\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"Pong!\\\",\\\"reasoning_content\\\":\\\"The user says \\\\\\\"ping\\\\\\\". This is a simple request, likely a test to see if the model is responding. So we can respond with \\\\\\\"pong\\\\\\\" or something like that. According to instructions, the a\",\"completion_status\":200,\"completion_type\":\"text/event-stream\",\"effective_probe_key_fingerprint\":\"sha256:db2c7532705c64379db087705dd0659a5ccf230f83af1d6168ad85d4e3650719\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"MiniMax-M2.5-highspeed\",\"MiniMax-M2.7-highspeed\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782231-e51a68c5\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"16\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"succeeded","host_id":3,"id":32,"mode":"partial","pack_id":1,"provider_id":35},"items":[{"account_status":"passed","batch_id":32,"id":28,"key_fingerprint":"sha256:3285f7116ec262d059c83dbdaf041eb7fcf6d04e2abdacbbff94891648beaccd","probe_summary_json":"{\"account_id\":\"6\",\"models\":[{\"id\":\"MiniMax-M2.5-highspeed\",\"display_name\":\"MiniMax-M2.5-highspeed\",\"type\":\"model\"},{\"id\":\"MiniMax-M2.7-highspeed\",\"display_name\":\"MiniMax-M2.7-highspeed\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"\",\"probe_ok\":true,\"probe_status\":\"passed\",\"smoke_model_seen\":true,\"validation_status\":\"passed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":66,"BatchID":32,"HostID":3,"ResourceType":"group","HostResourceID":"5","ResourceName":"MiniMax 53hk 默认分组-subscription"},{"ID":67,"BatchID":32,"HostID":3,"ResourceType":"channel","HostResourceID":"4","ResourceName":"MiniMax 53hk 默认渠道-subscription"},{"ID":68,"BatchID":32,"HostID":3,"ResourceType":"plan","HostResourceID":"4","ResourceName":"MiniMax 53hk 默认套餐-subscription"},{"ID":69,"BatchID":32,"HostID":3,"ResourceType":"account","HostResourceID":"6","ResourceName":"minimax-53hk-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/05-subscription-access-prep.summary.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/05-subscription-access-prep.summary.json new file mode 100644 index 00000000..3d1680e0 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/05-subscription-access-prep.summary.json @@ -0,0 +1,12 @@ +{ + "subscription_user_id_hash": "b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9", + "subscription_group_id": 5, + "min_balance": 10, + "subscription_days": 30, + "api_key": { + "present": true, + "prefix": "sk-1", + "suffix": "68c5", + "fingerprint": "e885c4cfe8698c77c08d8534175c42aea41996d8bdb6f42e0871c846505ef4b4" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/06-subscription-access-prep.psql.txt b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/06-subscription-access-prep.psql.txt new file mode 100644 index 00000000..894b2e3a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/06-subscription-access-prep.psql.txt @@ -0,0 +1,5 @@ +BEGIN +UPDATE 1 +UPDATE 1 +INSERT 0 1 +COMMIT diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/07-redis-targeted-invalidation.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/07-redis-targeted-invalidation.json new file mode 100644 index 00000000..85a0578a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/07-redis-targeted-invalidation.json @@ -0,0 +1,6 @@ +{ + "auth_cache_invalidated": true, + "balance_cache_invalidated": true, + "subscription_cache_invalidated": true, + "redis_del_exit_code": 0 +} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/08-subscription-group-state.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/08-subscription-group-state.json new file mode 100644 index 00000000..2266b072 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/08-subscription-group-state.json @@ -0,0 +1,28 @@ +{ + "group_id": 5, + "group": { + "id": 5, + "name": "MiniMax 53hk 默认分组-subscription", + "type": null, + "subscription_type": "subscription" + }, + "subscription": { + "id": 15, + "user_id_hash": "4523540f1504cd17100c4835e85b7eefd49911580f8efff0599a8f283be6b9e3", + "group_id": 5, + "status": "active", + "starts_at": "2026-05-26T07:57:14.559957+00:00", + "expires_at": "2026-06-25T07:57:14.559957+00:00" + }, + "key": { + "id": 16, + "group_id": 5, + "status": "active", + "redacted": { + "present": true, + "prefix": "sk-r", + "suffix": "8583", + "fingerprint": "db2c7532705c64379db087705dd0659a5ccf230f83af1d6168ad85d4e3650719" + } + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/09-models.headers.txt b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/09-models.headers.txt new file mode 100644 index 00000000..85ce3af1 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/09-models.headers.txt @@ -0,0 +1,9 @@ +HTTP/1.1 200 OK +Content-Type: application/json; charset=utf-8 +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: 979b8f14-3891-47e0-8113-83ccdff575b6 +Date: Tue, 26 May 2026 07:57:23 GMT +Content-Length: 272 + diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/10-models.body.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/10-models.body.json new file mode 100644 index 00000000..2741b29d --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/10-models.body.json @@ -0,0 +1 @@ +{"data":[{"id":"MiniMax-M2.5-highspeed","type":"model","display_name":"MiniMax-M2.5-highspeed","created_at":"2024-01-01T00:00:00Z"},{"id":"MiniMax-M2.7-highspeed","type":"model","display_name":"MiniMax-M2.7-highspeed","created_at":"2024-01-01T00:00:00Z"}],"object":"list"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/11-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/11-chat.headers.txt new file mode 100644 index 00000000..860cff60 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/11-chat.headers.txt @@ -0,0 +1,11 @@ +HTTP/1.1 200 OK +Cache-Control: max-age=0 +Content-Type: text/event-stream +Date: Tue, 26 May 2026 07:57:26 GMT +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: 4aee6281-bb83-45fd-9245-4a692943d387 +X-Request-Id: 189a0bc0-02fc-464a-8263-39fce0776c66 +Content-Length: 586 + diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/12-chat.body.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/12-chat.body.json new file mode 100644 index 00000000..82fe2a44 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/12-chat.body.json @@ -0,0 +1 @@ +{"id":"066485669fd30c27c3eb13e4ec6f65d0","object":"chat.completion","created":1779782249,"model":"MiniMax-M2.7-highspeed","choices":[{"index":0,"message":{"role":"assistant","content":"pong! 👋\n\nI'm here and ready to help! What can I do for you today?","reasoning_content":"The user just said \"ping\". This is typically a simple test to see if the AI is responsive. I should respond in a friendly, helpful way acknowledging the ping and letting them know I'm here and ready to help."},"finish_reason":"stop"}],"usage":{"prompt_tokens":42,"completion_tokens":68,"total_tokens":110}} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/13-provider-status.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/13-provider-status.json new file mode 100644 index 00000000..9e811627 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/13-provider-status.json @@ -0,0 +1 @@ +{"access_closures_count":1,"batch":{"access_status":"subscription_ready","batch_status":"succeeded","id":32,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18169","host_id":"remote43-kimi-patched-auto2-18169","host_version":"0.1.126"},"latest_access_status":"subscription_ready","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":4,"pack":{"pack_id":"openai-cn-pack","version":"1.1.4"},"provider":{"display_name":"MiniMax 53hk 中转兼容","platform":"openai","provider_id":"minimax-53hk"},"provider_status":"active","reconcile_runs_count":0} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/14-access-status.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/14-access-status.json new file mode 100644 index 00000000..60bf6f95 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/14-access-status.json @@ -0,0 +1 @@ +{"batch_access_status":"subscription_ready","batch_id":32,"closures_count":1,"latest_access_status":"subscription_ready","latest_closure":{"closure_type":"subscription","details_json":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"0664855a28dd148f45976c5f50bb3a6e\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782237,\\\"model\\\":\\\"MiniMax-M2.7-highspeed\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"Pong!\\\",\\\"reasoning_content\\\":\\\"The user says \\\\\\\"ping\\\\\\\". This is a simple request, likely a test to see if the model is responding. So we can respond with \\\\\\\"pong\\\\\\\" or something like that. According to instructions, the a\",\"completion_status\":200,\"completion_type\":\"text/event-stream\",\"effective_probe_key_fingerprint\":\"sha256:db2c7532705c64379db087705dd0659a5ccf230f83af1d6168ad85d4e3650719\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"MiniMax-M2.5-highspeed\",\"MiniMax-M2.7-highspeed\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782231-e51a68c5\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"16\"]}","id":33,"status":"subscription_ready"},"pack_id":"openai-cn-pack","provider_id":"minimax-53hk"} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/15-access-preview.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/15-access-preview.json new file mode 100644 index 00000000..739625a2 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/15-access-preview.json @@ -0,0 +1 @@ +{"provider_id":"minimax-53hk","mode":"subscription","available":true,"message":"latest access status: subscription_ready"} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/16-batch-detail-final.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/16-batch-detail-final.json new file mode 100644 index 00000000..b2262481 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/16-batch-detail-final.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":33,"BatchID":32,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"0664855a28dd148f45976c5f50bb3a6e\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782237,\\\"model\\\":\\\"MiniMax-M2.7-highspeed\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"Pong!\\\",\\\"reasoning_content\\\":\\\"The user says \\\\\\\"ping\\\\\\\". This is a simple request, likely a test to see if the model is responding. So we can respond with \\\\\\\"pong\\\\\\\" or something like that. According to instructions, the a\",\"completion_status\":200,\"completion_type\":\"text/event-stream\",\"effective_probe_key_fingerprint\":\"sha256:db2c7532705c64379db087705dd0659a5ccf230f83af1d6168ad85d4e3650719\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"MiniMax-M2.5-highspeed\",\"MiniMax-M2.7-highspeed\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782231-e51a68c5\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"16\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"succeeded","host_id":3,"id":32,"mode":"partial","pack_id":1,"provider_id":35},"items":[{"account_status":"passed","batch_id":32,"id":28,"key_fingerprint":"sha256:3285f7116ec262d059c83dbdaf041eb7fcf6d04e2abdacbbff94891648beaccd","probe_summary_json":"{\"account_id\":\"6\",\"models\":[{\"id\":\"MiniMax-M2.5-highspeed\",\"display_name\":\"MiniMax-M2.5-highspeed\",\"type\":\"model\"},{\"id\":\"MiniMax-M2.7-highspeed\",\"display_name\":\"MiniMax-M2.7-highspeed\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"\",\"probe_ok\":true,\"probe_status\":\"passed\",\"smoke_model_seen\":true,\"validation_status\":\"passed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":66,"BatchID":32,"HostID":3,"ResourceType":"group","HostResourceID":"5","ResourceName":"MiniMax 53hk 默认分组-subscription"},{"ID":67,"BatchID":32,"HostID":3,"ResourceType":"channel","HostResourceID":"4","ResourceName":"MiniMax 53hk 默认渠道-subscription"},{"ID":68,"BatchID":32,"HostID":3,"ResourceType":"plan","HostResourceID":"4","ResourceName":"MiniMax 53hk 默认套餐-subscription"},{"ID":69,"BatchID":32,"HostID":3,"ResourceType":"account","HostResourceID":"6","ResourceName":"minimax-53hk-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/17-upstream-models.headers.txt b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/17-upstream-models.headers.txt new file mode 100644 index 00000000..b957b4c3 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/17-upstream-models.headers.txt @@ -0,0 +1,16 @@ +HTTP/2 200 +server: nginx/1.24.0 (Ubuntu) +content-type: application/json; charset=utf-8 +referrer-policy: strict-origin-when-cross-origin +x-content-type-options: nosniff +x-frame-options: DENY +x-request-id: 38a0d4e9-0d98-4bcc-b086-1c95a7852983 +age: 0 +content-length: 478 +date: Tue, 26 May 2026 07:57:31 GMT +eo-log-uuid: 18238975390280828441 +eo-cache-status: MISS +cache-control: max-age=0 +nel: {"success_fraction":0.1,"report_to":"eo-nel","max_age":604800} +report-to: {"endpoints":[{"url":"https://nel.teo-rum.com/eo-cgi/nel"}],"group":"eo-nel","max_age":604800} + diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/18-upstream-models.body.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/18-upstream-models.body.json new file mode 100644 index 00000000..ae002896 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/18-upstream-models.body.json @@ -0,0 +1 @@ +{"data":[{"id":"MiniMax-M2.5","type":"model","display_name":"MiniMax-M2.5","created_at":"2024-01-01T00:00:00Z"},{"id":"MiniMax-M2.5-highspeed","type":"model","display_name":"MiniMax-M2.5-highspeed","created_at":"2024-01-01T00:00:00Z"},{"id":"MiniMax-M2.7","type":"model","display_name":"MiniMax-M2.7","created_at":"2024-01-01T00:00:00Z"},{"id":"MiniMax-M2.7-highspeed","type":"model","display_name":"MiniMax-M2.7-highspeed","created_at":"2024-01-01T00:00:00Z"}],"object":"list"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/19-upstream-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/19-upstream-chat.headers.txt new file mode 100644 index 00000000..aac5583d --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/19-upstream-chat.headers.txt @@ -0,0 +1,16 @@ +HTTP/2 200 +server: nginx/1.24.0 (Ubuntu) +content-type: text/event-stream; charset=utf-8 +referrer-policy: strict-origin-when-cross-origin +x-content-type-options: nosniff +x-frame-options: DENY +x-request-id: 0276ae22-ee68-44cf-bc80-8e0af8dbd334 +age: 0 +content-length: 528 +date: Tue, 26 May 2026 07:57:35 GMT +eo-log-uuid: 698325288894863885 +eo-cache-status: MISS +cache-control: max-age=0 +nel: {"success_fraction":0.1,"report_to":"eo-nel","max_age":604800} +report-to: {"endpoints":[{"url":"https://nel.teo-rum.com/eo-cgi/nel"}],"group":"eo-nel","max_age":604800} + diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/20-upstream-chat.body.txt b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/20-upstream-chat.body.txt new file mode 100644 index 00000000..6ce0b8c6 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/20-upstream-chat.body.txt @@ -0,0 +1 @@ +{"id":"0664856f32662f92e40afacfcb21f37c","object":"chat.completion","created":1779782257,"model":"MiniMax-M2.7-highspeed","choices":[{"index":0,"message":{"role":"assistant","content":"pong! 👋\n\nI'm here and ready to help. What can I do for you today?","reasoning_content":"The user has sent just the word \"ping\". This is likely a test message to check if the AI is responsive. I should respond with a simple acknowledgment."},"finish_reason":"stop"}],"usage":{"prompt_tokens":42,"completion_tokens":56,"total_tokens":98}} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/21-summary.json b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/21-summary.json new file mode 100644 index 00000000..31775fff --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep/21-summary.json @@ -0,0 +1 @@ +{"artifact_dir": "/home/long/project/sub2api-cn-relay-manager/artifacts/real-host-acceptance/20260526_155705_remote43_minimax53hk_multi_model_rootprep", "provider_id": "minimax-53hk", "batch_id": 32, "batch_status": "succeeded", "access_status_from_import": "subscription_ready", "provider_status_from_import": "active", "direct_models_http200": true, "direct_models_has_expected_model": true, "direct_models": ["MiniMax-M2.5-highspeed", "MiniMax-M2.7-highspeed"], "direct_chat_http200": true, "direct_chat_status": 200, "upstream_models": ["MiniMax-M2.5", "MiniMax-M2.5-highspeed", "MiniMax-M2.7", "MiniMax-M2.7-highspeed"], "upstream_models_has_expected_model": true, "upstream_chat_status": 200, "completion_classification": "unknown", "latest_access_status": "subscription_ready", "preview_available": true, "accepted_keys_count": 1, "subscription_group_id": "5", "import_group_id": "5"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/00-local-key-source.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/00-local-key-source.json new file mode 100644 index 00000000..9df7767b --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "file:/tmp/remote43-deepseek-official.key", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01-runtime-context.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01-runtime-context.json new file mode 100644 index 00000000..9c0d746f --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01-runtime-context.json @@ -0,0 +1,25 @@ +{ + "crm_base": "http://127.0.0.1:29473", + "host_base": "http://127.0.0.1:29469", + "crm_host_base": "http://127.0.0.1:18169", + "remote_host_base": "http://127.0.0.1:18169", + "provider_id": "deepseek-chat-official", + "subscription_group_id": "6", + "import_group_id": null, + "subscription_user_id_hash": "4ec9599fc203d176a301536c2e091a19bc852759b255bd6818810a42c5fed14a", + "managed_user_id_hash": "9400f1b21cb527d7fa3d3eabba93557a18ebe7a2ca4e471cfe5e4c5b4ca7f767", + "admin_user_id_hash": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", + "managed_user_email_hash": "bc794d2f79b435fa2fb040da26348b8818fd2dd356545f0ceb10c7a69b600e70", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "e776", + "fingerprint": "743131954e39c66b6871544aecb8ef247c259b79bea3b948b30291c81511fadf" + }, + "managed_probe_key": { + "present": true, + "prefix": "sk-r", + "suffix": "dfa9", + "fingerprint": "1c49dc0fe3ffe5f2c79c2e304ab1a4e503f9a48f72428613f144d65b30de6de6" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01a-create-host.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01a-create-host.json new file mode 100644 index 00000000..f1ac25b2 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-kimi-patched-auto2-18169", "base_url": "http://127.0.0.1:18169", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/02-import.headers.txt b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/02-import.headers.txt new file mode 100644 index 00000000..39b86437 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Content-Type: application/json +Date: Tue, 26 May 2026 07:58:18 GMT +Content-Length: 1044 + diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/03-import.body.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/03-import.body.json new file mode 100644 index 00000000..b4426afe --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":1,"access_status":"subscription_ready","accounts_count":1,"batch_id":33,"batch_status":"partially_succeeded","channel":{"id":"5","name":"DeepSeek Chat 官方默认渠道-subscription"},"gateway":{"ok":true,"status_code":200,"models":["deepseek-chat"],"has_expected_model":true,"completion_ok":true,"completion_status":200,"completion_content_type":"application/json","completion_body_preview":"{\"id\":\"a55a7257-74b3-45d0-912a-8ef90b4fadbd\",\"object\":\"chat.completion\",\"created\":1779782297,\"model\":\"deepseek-v4-flash\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"你好!看起来你只输入了“\"},\"logprobs\":null,\"finish_reason\":\"length\"}],\"usage\":{\"prompt_tokens\":5,\"completion_tokens\":8,\"total_tokens\":13,\"prompt_tokens_details\":{\"cached_tokens\":0},\"prompt_cache_hit_token"},"group":{"id":"6","name":"DeepSeek Chat 官方默认分组-subscription"},"plan":{"id":"5","name":"DeepSeek Chat 官方默认套餐-subscription"},"provider_status":"degraded"} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/04-batch-detail-initial.json new file mode 100644 index 00000000..d8a7b7f0 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/04-batch-detail-initial.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":34,"BatchID":33,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"a55a7257-74b3-45d0-912a-8ef90b4fadbd\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782297,\\\"model\\\":\\\"deepseek-v4-flash\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"你好!看起来你只输入了“\\\"},\\\"logprobs\\\":null,\\\"finish_reason\\\":\\\"length\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":5,\\\"completion_tokens\\\":8,\\\"total_tokens\\\":13,\\\"prompt_tokens_details\\\":{\\\"cached_tokens\\\":0},\\\"prompt_cache_hit_token\",\"completion_status\":200,\"completion_type\":\"application/json\",\"effective_probe_key_fingerprint\":\"sha256:1c49dc0fe3ffe5f2c79c2e304ab1a4e503f9a48f72428613f144d65b30de6de6\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-chat\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782295-29bbe776\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"18\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"partially_succeeded","host_id":3,"id":33,"mode":"partial","pack_id":1,"provider_id":36},"items":[{"account_status":"failed","batch_id":33,"id":29,"key_fingerprint":"sha256:90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293","probe_summary_json":"{\"account_id\":\"7\",\"models\":[{\"id\":\"deepseek-chat\",\"display_name\":\"deepseek-chat\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"API returned 404:\",\"probe_ok\":false,\"probe_status\":\"failed\",\"smoke_model_seen\":true,\"validation_status\":\"failed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":70,"BatchID":33,"HostID":3,"ResourceType":"group","HostResourceID":"6","ResourceName":"DeepSeek Chat 官方默认分组-subscription"},{"ID":71,"BatchID":33,"HostID":3,"ResourceType":"channel","HostResourceID":"5","ResourceName":"DeepSeek Chat 官方默认渠道-subscription"},{"ID":72,"BatchID":33,"HostID":3,"ResourceType":"plan","HostResourceID":"5","ResourceName":"DeepSeek Chat 官方默认套餐-subscription"},{"ID":73,"BatchID":33,"HostID":3,"ResourceType":"account","HostResourceID":"7","ResourceName":"deepseek-chat-official-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/05-subscription-access-prep.summary.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/05-subscription-access-prep.summary.json new file mode 100644 index 00000000..7016d4be --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/05-subscription-access-prep.summary.json @@ -0,0 +1,12 @@ +{ + "subscription_user_id_hash": "4ec9599fc203d176a301536c2e091a19bc852759b255bd6818810a42c5fed14a", + "subscription_group_id": 6, + "min_balance": 10, + "subscription_days": 30, + "api_key": { + "present": true, + "prefix": "sk-1", + "suffix": "e776", + "fingerprint": "743131954e39c66b6871544aecb8ef247c259b79bea3b948b30291c81511fadf" + } +} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/06-subscription-access-prep.psql.txt b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/06-subscription-access-prep.psql.txt new file mode 100644 index 00000000..894b2e3a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/06-subscription-access-prep.psql.txt @@ -0,0 +1,5 @@ +BEGIN +UPDATE 1 +UPDATE 1 +INSERT 0 1 +COMMIT diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/07-redis-targeted-invalidation.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/07-redis-targeted-invalidation.json new file mode 100644 index 00000000..85a0578a --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/07-redis-targeted-invalidation.json @@ -0,0 +1,6 @@ +{ + "auth_cache_invalidated": true, + "balance_cache_invalidated": true, + "subscription_cache_invalidated": true, + "redis_del_exit_code": 0 +} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/08-subscription-group-state.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/08-subscription-group-state.json new file mode 100644 index 00000000..ab213ecb --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/08-subscription-group-state.json @@ -0,0 +1,28 @@ +{ + "group_id": 6, + "group": { + "id": 6, + "name": "DeepSeek Chat 官方默认分组-subscription", + "type": null, + "subscription_type": "subscription" + }, + "subscription": { + "id": 17, + "user_id_hash": "9400f1b21cb527d7fa3d3eabba93557a18ebe7a2ca4e471cfe5e4c5b4ca7f767", + "group_id": 6, + "status": "active", + "starts_at": "2026-05-26T07:58:17.385782+00:00", + "expires_at": "2026-06-25T07:58:17.385782+00:00" + }, + "key": { + "id": 18, + "group_id": 6, + "status": "active", + "redacted": { + "present": true, + "prefix": "sk-r", + "suffix": "dfa9", + "fingerprint": "1c49dc0fe3ffe5f2c79c2e304ab1a4e503f9a48f72428613f144d65b30de6de6" + } + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/09-models.headers.txt b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/09-models.headers.txt new file mode 100644 index 00000000..f4a3af0c --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/09-models.headers.txt @@ -0,0 +1,9 @@ +HTTP/1.1 200 OK +Content-Type: application/json; charset=utf-8 +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: 9643c5cf-0f74-4d99-91ac-79e892fd6dbd +Date: Tue, 26 May 2026 07:58:24 GMT +Content-Length: 131 + diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/10-models.body.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/10-models.body.json new file mode 100644 index 00000000..c0e7bee5 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/10-models.body.json @@ -0,0 +1 @@ +{"data":[{"id":"deepseek-chat","type":"model","display_name":"deepseek-chat","created_at":"2024-01-01T00:00:00Z"}],"object":"list"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/11-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/11-chat.headers.txt new file mode 100644 index 00000000..fdd886d1 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/11-chat.headers.txt @@ -0,0 +1,10 @@ +HTTP/1.1 200 OK +Content-Type: application/json +Date: Tue, 26 May 2026 07:58:27 GMT +Referrer-Policy: strict-origin-when-cross-origin +Vary: origin, access-control-request-method, access-control-request-headers +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: 95e8b49d-cf46-4ede-9d5e-2fb4e4c075d7 +Content-Length: 502 + diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/12-chat.body.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/12-chat.body.json new file mode 100644 index 00000000..ea0e48ea --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/12-chat.body.json @@ -0,0 +1 @@ +{"id":"3b8a68a1-8630-46b0-8720-e5113f50f208","object":"chat.completion","created":1779782307,"model":"deepseek-v4-flash","choices":[{"index":0,"message":{"role":"assistant","content":"你好!看起来你只输入了“"},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":5,"completion_tokens":8,"total_tokens":13,"prompt_tokens_details":{"cached_tokens":0},"prompt_cache_hit_tokens":0,"prompt_cache_miss_tokens":5},"system_fingerprint":"fp_8b330d02d0_prod0820_fp8_kvcache_20260402"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/13-provider-status.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/13-provider-status.json new file mode 100644 index 00000000..077c2c75 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/13-provider-status.json @@ -0,0 +1 @@ +{"access_closures_count":1,"batch":{"access_status":"subscription_ready","batch_status":"partially_succeeded","id":33,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18169","host_id":"remote43-kimi-patched-auto2-18169","host_version":"0.1.126"},"latest_access_status":"subscription_ready","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":4,"pack":{"pack_id":"openai-cn-pack","version":"1.1.4"},"provider":{"display_name":"DeepSeek Chat 官方兼容","platform":"openai","provider_id":"deepseek-chat-official"},"provider_status":"partially_succeeded","reconcile_runs_count":0} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/14-access-status.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/14-access-status.json new file mode 100644 index 00000000..6c867756 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/14-access-status.json @@ -0,0 +1 @@ +{"batch_access_status":"subscription_ready","batch_id":33,"closures_count":1,"latest_access_status":"subscription_ready","latest_closure":{"closure_type":"subscription","details_json":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"a55a7257-74b3-45d0-912a-8ef90b4fadbd\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782297,\\\"model\\\":\\\"deepseek-v4-flash\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"你好!看起来你只输入了“\\\"},\\\"logprobs\\\":null,\\\"finish_reason\\\":\\\"length\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":5,\\\"completion_tokens\\\":8,\\\"total_tokens\\\":13,\\\"prompt_tokens_details\\\":{\\\"cached_tokens\\\":0},\\\"prompt_cache_hit_token\",\"completion_status\":200,\"completion_type\":\"application/json\",\"effective_probe_key_fingerprint\":\"sha256:1c49dc0fe3ffe5f2c79c2e304ab1a4e503f9a48f72428613f144d65b30de6de6\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-chat\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782295-29bbe776\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"18\"]}","id":34,"status":"subscription_ready"},"pack_id":"openai-cn-pack","provider_id":"deepseek-chat-official"} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/15-access-preview.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/15-access-preview.json new file mode 100644 index 00000000..ce60f791 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/15-access-preview.json @@ -0,0 +1 @@ +{"provider_id":"deepseek-chat-official","mode":"subscription","available":true,"message":"latest access status: subscription_ready"} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/16-batch-detail-final.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/16-batch-detail-final.json new file mode 100644 index 00000000..d8a7b7f0 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/16-batch-detail-final.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":34,"BatchID":33,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"a55a7257-74b3-45d0-912a-8ef90b4fadbd\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779782297,\\\"model\\\":\\\"deepseek-v4-flash\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"你好!看起来你只输入了“\\\"},\\\"logprobs\\\":null,\\\"finish_reason\\\":\\\"length\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":5,\\\"completion_tokens\\\":8,\\\"total_tokens\\\":13,\\\"prompt_tokens_details\\\":{\\\"cached_tokens\\\":0},\\\"prompt_cache_hit_token\",\"completion_status\":200,\"completion_type\":\"application/json\",\"effective_probe_key_fingerprint\":\"sha256:1c49dc0fe3ffe5f2c79c2e304ab1a4e503f9a48f72428613f144d65b30de6de6\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-chat\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779782295-29bbe776\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"18\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"partially_succeeded","host_id":3,"id":33,"mode":"partial","pack_id":1,"provider_id":36},"items":[{"account_status":"failed","batch_id":33,"id":29,"key_fingerprint":"sha256:90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293","probe_summary_json":"{\"account_id\":\"7\",\"models\":[{\"id\":\"deepseek-chat\",\"display_name\":\"deepseek-chat\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"API returned 404:\",\"probe_ok\":false,\"probe_status\":\"failed\",\"smoke_model_seen\":true,\"validation_status\":\"failed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":70,"BatchID":33,"HostID":3,"ResourceType":"group","HostResourceID":"6","ResourceName":"DeepSeek Chat 官方默认分组-subscription"},{"ID":71,"BatchID":33,"HostID":3,"ResourceType":"channel","HostResourceID":"5","ResourceName":"DeepSeek Chat 官方默认渠道-subscription"},{"ID":72,"BatchID":33,"HostID":3,"ResourceType":"plan","HostResourceID":"5","ResourceName":"DeepSeek Chat 官方默认套餐-subscription"},{"ID":73,"BatchID":33,"HostID":3,"ResourceType":"account","HostResourceID":"7","ResourceName":"deepseek-chat-official-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/17-upstream-models.headers.txt b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/17-upstream-models.headers.txt new file mode 100644 index 00000000..58915abd --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/17-upstream-models.headers.txt @@ -0,0 +1,15 @@ +HTTP/2 200 +content-type: application/json +content-length: 156 +date: Tue, 26 May 2026 07:58:31 GMT +server: elb +vary: origin, access-control-request-method, access-control-request-headers +access-control-allow-credentials: true +x-ds-trace-id: 2ededce6844bbe2a4c807dfadf8f0142 +strict-transport-security: max-age=31536000; includeSubDomains; preload +x-content-type-options: nosniff +x-cache: Miss from cloudfront +via: 1.1 50424b69466902b7435628c25e360b62.cloudfront.net (CloudFront) +x-amz-cf-pop: ICN57-P3 +x-amz-cf-id: c4qlrmeXRjSKZYj73EWurpPZxh2IAekeSgIW1XaKdFa_gmeEMqMexQ== + diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/18-upstream-models.body.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/18-upstream-models.body.json new file mode 100644 index 00000000..4339c413 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/18-upstream-models.body.json @@ -0,0 +1 @@ +{"object":"list","data":[{"id":"deepseek-v4-flash","object":"model","owned_by":"deepseek"},{"id":"deepseek-v4-pro","object":"model","owned_by":"deepseek"}]} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/19-upstream-chat.headers.txt b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/19-upstream-chat.headers.txt new file mode 100644 index 00000000..d37a3f84 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/19-upstream-chat.headers.txt @@ -0,0 +1,14 @@ +HTTP/2 200 +content-type: application/json +date: Tue, 26 May 2026 07:58:34 GMT +x-content-type-options: nosniff +server: elb +vary: origin, access-control-request-method, access-control-request-headers +access-control-allow-credentials: true +x-ds-trace-id: b7cf8b3a81df4222191a43ef62a4df0b +strict-transport-security: max-age=31536000; includeSubDomains; preload +x-cache: Miss from cloudfront +via: 1.1 7e6183696896ff05ac225abd1de9e364.cloudfront.net (CloudFront) +x-amz-cf-pop: ICN80-P2 +x-amz-cf-id: 5oW5De--oQcelJ4leR3xYfHzYz6p4NPTTL9yyWrxbPAeTqy6EBkAjg== + diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/20-upstream-chat.body.txt b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/20-upstream-chat.body.txt new file mode 100644 index 00000000..79f530c4 --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/20-upstream-chat.body.txt @@ -0,0 +1 @@ +{"id":"0c43df04-1f8f-4b37-ad70-8d61fc817237","object":"chat.completion","created":1779782314,"model":"deepseek-v4-flash","choices":[{"index":0,"message":{"role":"assistant","content":"你好!看起来你只输入了“"},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":5,"completion_tokens":8,"total_tokens":13,"prompt_tokens_details":{"cached_tokens":0},"prompt_cache_hit_tokens":0,"prompt_cache_miss_tokens":5},"system_fingerprint":"fp_8b330d02d0_prod0820_fp8_kvcache_20260402"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/21-summary.json b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/21-summary.json new file mode 100644 index 00000000..ef6fe3da --- /dev/null +++ b/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/21-summary.json @@ -0,0 +1 @@ +{"artifact_dir": "/home/long/project/sub2api-cn-relay-manager/artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep", "provider_id": "deepseek-chat-official", "batch_id": 33, "batch_status": "partially_succeeded", "access_status_from_import": "subscription_ready", "provider_status_from_import": "degraded", "direct_models_http200": true, "direct_models_has_expected_model": true, "direct_models": ["deepseek-chat"], "direct_chat_http200": true, "direct_chat_status": 200, "upstream_models": ["deepseek-v4-flash", "deepseek-v4-pro"], "upstream_models_has_expected_model": false, "upstream_chat_status": 200, "completion_classification": "unknown", "latest_access_status": "subscription_ready", "preview_available": true, "accepted_keys_count": 1, "subscription_group_id": "6", "import_group_id": "6"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/01-runtime-context.json b/artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/01-runtime-context.json new file mode 100644 index 00000000..99a3b4f1 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_001413_remote43_deepseek-chat-official_key_import/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18088", + "host_base": "http://127.0.0.1:18087", + "crm_host_base": "http://127.0.0.1:18087", + "remote_host_base": "http://127.0.0.1:18087", + "provider_id": "deepseek-chat-official", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "c8bd", + "fingerprint": "ca052e60820f3457831e3080de38cc3c14889bef4838b485377afca5567a1481" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/01-runtime-context.json b/artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/01-runtime-context.json new file mode 100644 index 00000000..d08614a8 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_045812_remote43_deepseek-chat-official_key_import/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18143", + "host_base": "http://127.0.0.1:18139", + "crm_host_base": "http://127.0.0.1:18139", + "remote_host_base": "http://127.0.0.1:18139", + "provider_id": "deepseek-chat-official", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "1af5", + "fingerprint": "d4149a4ab1981c925e012fd5b2ff5bc6d63cf95b5a748c3df3ac6f77771ce4fe" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01-runtime-context.json b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01-runtime-context.json new file mode 100644 index 00000000..676fe424 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18143", + "host_base": "http://127.0.0.1:18139", + "crm_host_base": "http://127.0.0.1:18139", + "remote_host_base": "http://127.0.0.1:18139", + "provider_id": "deepseek-chat-official", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "ea83", + "fingerprint": "690b6ef005031b0631dac94e440e8b432bf62042087cb980d0b742fa0c49c47c" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01a-create-host.json b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01a-create-host.json new file mode 100644 index 00000000..73cbf345 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/01a-create-host.json @@ -0,0 +1 @@ +{"host_id":"remote43-patched-18139","base_url":"http://127.0.0.1:18139","host_version":"0.1.126","auth_type":"bearer","status":"unsupported","capabilities":{"groups":true,"channels":true,"plans":true,"accounts":true,"account_test":false,"account_models":true,"subscriptions":true}} diff --git a/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/02-import.headers.txt b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/02-import.headers.txt new file mode 100644 index 00000000..d0c944f1 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 500 Internal Server Error +Content-Type: application/json +Date: Tue, 26 May 2026 20:59:52 GMT +Content-Length: 369 + diff --git a/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/03-import.body.json b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/03-import.body.json new file mode 100644 index 00000000..a129cb30 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":0,"access_status":"","accounts_count":0,"batch_id":0,"batch_status":"","error":{"code":"internal_error","message":"update host \"remote43-patched-18139\" probe: database is locked (5) (SQLITE_BUSY)"},"gateway":{"ok":false,"status_code":0,"models":null,"has_expected_model":false,"completion_ok":false,"completion_status":0},"provider_status":""} diff --git a/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260527_045945_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json new file mode 100644 index 00000000..e69de29b diff --git a/artifacts/real-host-acceptance/20260527_051447_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_051447_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051447_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01-runtime-context.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01-runtime-context.json new file mode 100644 index 00000000..a0381bdb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01-runtime-context.json @@ -0,0 +1,25 @@ +{ + "crm_base": "http://127.0.0.1:18143", + "host_base": "http://127.0.0.1:18139", + "crm_host_base": "http://127.0.0.1:18139", + "remote_host_base": "http://127.0.0.1:18139", + "provider_id": "deepseek-chat-official", + "subscription_group_id": "2", + "import_group_id": null, + "subscription_user_id_hash": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", + "managed_user_id_hash": "4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce", + "admin_user_id_hash": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", + "managed_user_email_hash": "ac10dfb7b18bd7397dc5cfb877667cd306c50f7aac2625c3ace9bb18faefbc5d", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "ea83", + "fingerprint": "690b6ef005031b0631dac94e440e8b432bf62042087cb980d0b742fa0c49c47c" + }, + "managed_probe_key": { + "present": true, + "prefix": "sk-r", + "suffix": "84ee", + "fingerprint": "cd65766a8ecd833a5eb4cba4d21b89d319ee6028c63787b67c3c828c0c1ad597" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01a-create-host.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01a-create-host.json new file mode 100644 index 00000000..5eb0fd7c --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-patched-18139", "base_url": "http://127.0.0.1:18139", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/02-import.headers.txt b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/02-import.headers.txt new file mode 100644 index 00000000..3f5e5a56 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Content-Type: application/json +Date: Tue, 26 May 2026 21:17:02 GMT +Content-Length: 1044 + diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/03-import.body.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/03-import.body.json new file mode 100644 index 00000000..610892e5 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":1,"access_status":"subscription_ready","accounts_count":1,"batch_id":34,"batch_status":"partially_succeeded","channel":{"id":"1","name":"DeepSeek Chat 官方默认渠道-subscription"},"gateway":{"ok":true,"status_code":200,"models":["deepseek-chat"],"has_expected_model":true,"completion_ok":true,"completion_status":200,"completion_content_type":"application/json","completion_body_preview":"{\"id\":\"25467a60-904b-430d-8c6b-a40a3e30e828\",\"object\":\"chat.completion\",\"created\":1779830221,\"model\":\"deepseek-v4-flash\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"你好!看起来你只输入了“\"},\"logprobs\":null,\"finish_reason\":\"length\"}],\"usage\":{\"prompt_tokens\":5,\"completion_tokens\":8,\"total_tokens\":13,\"prompt_tokens_details\":{\"cached_tokens\":0},\"prompt_cache_hit_token"},"group":{"id":"2","name":"DeepSeek Chat 官方默认分组-subscription"},"plan":{"id":"1","name":"DeepSeek Chat 官方默认套餐-subscription"},"provider_status":"degraded"} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json new file mode 100644 index 00000000..5c97793d --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":35,"BatchID":34,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"25467a60-904b-430d-8c6b-a40a3e30e828\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779830221,\\\"model\\\":\\\"deepseek-v4-flash\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"你好!看起来你只输入了“\\\"},\\\"logprobs\\\":null,\\\"finish_reason\\\":\\\"length\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":5,\\\"completion_tokens\\\":8,\\\"total_tokens\\\":13,\\\"prompt_tokens_details\\\":{\\\"cached_tokens\\\":0},\\\"prompt_cache_hit_token\",\"completion_status\":200,\"completion_type\":\"application/json\",\"effective_probe_key_fingerprint\":\"sha256:cd65766a8ecd833a5eb4cba4d21b89d319ee6028c63787b67c3c828c0c1ad597\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-chat\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779829190-3150ea83\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"2\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"partially_succeeded","host_id":4,"id":34,"mode":"partial","pack_id":1,"provider_id":36},"items":[{"account_status":"failed","batch_id":34,"id":30,"key_fingerprint":"sha256:90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293","probe_summary_json":"{\"account_id\":\"1\",\"models\":[{\"id\":\"deepseek-chat\",\"display_name\":\"deepseek-chat\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"API returned 404:\",\"probe_ok\":false,\"probe_status\":\"failed\",\"smoke_model_seen\":true,\"validation_status\":\"failed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":74,"BatchID":34,"HostID":4,"ResourceType":"group","HostResourceID":"2","ResourceName":"DeepSeek Chat 官方默认分组-subscription"},{"ID":75,"BatchID":34,"HostID":4,"ResourceType":"channel","HostResourceID":"1","ResourceName":"DeepSeek Chat 官方默认渠道-subscription"},{"ID":76,"BatchID":34,"HostID":4,"ResourceType":"plan","HostResourceID":"1","ResourceName":"DeepSeek Chat 官方默认套餐-subscription"},{"ID":77,"BatchID":34,"HostID":4,"ResourceType":"account","HostResourceID":"1","ResourceName":"deepseek-chat-official-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/05-subscription-access-prep.summary.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/05-subscription-access-prep.summary.json new file mode 100644 index 00000000..002e1645 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/05-subscription-access-prep.summary.json @@ -0,0 +1,12 @@ +{ + "subscription_user_id_hash": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", + "subscription_group_id": 2, + "min_balance": 10, + "subscription_days": 30, + "api_key": { + "present": true, + "prefix": "sk-1", + "suffix": "ea83", + "fingerprint": "690b6ef005031b0631dac94e440e8b432bf62042087cb980d0b742fa0c49c47c" + } +} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/06-subscription-access-prep.psql.txt b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/06-subscription-access-prep.psql.txt new file mode 100644 index 00000000..894b2e3a --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/06-subscription-access-prep.psql.txt @@ -0,0 +1,5 @@ +BEGIN +UPDATE 1 +UPDATE 1 +INSERT 0 1 +COMMIT diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/07-redis-targeted-invalidation.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/07-redis-targeted-invalidation.json new file mode 100644 index 00000000..85a0578a --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/07-redis-targeted-invalidation.json @@ -0,0 +1,6 @@ +{ + "auth_cache_invalidated": true, + "balance_cache_invalidated": true, + "subscription_cache_invalidated": true, + "redis_del_exit_code": 0 +} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/08-subscription-group-state.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/08-subscription-group-state.json new file mode 100644 index 00000000..e2199680 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/08-subscription-group-state.json @@ -0,0 +1,28 @@ +{ + "group_id": 2, + "group": { + "id": 2, + "name": "DeepSeek Chat 官方默认分组-subscription", + "type": null, + "subscription_type": "subscription" + }, + "subscription": { + "id": 1, + "user_id_hash": "4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce", + "group_id": 2, + "status": "active", + "starts_at": "2026-05-26T21:17:01.553933+00:00", + "expires_at": "2026-06-25T21:17:01.553933+00:00" + }, + "key": { + "id": 2, + "group_id": 2, + "status": "active", + "redacted": { + "present": true, + "prefix": "sk-r", + "suffix": "84ee", + "fingerprint": "cd65766a8ecd833a5eb4cba4d21b89d319ee6028c63787b67c3c828c0c1ad597" + } + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/09-models.headers.txt b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/09-models.headers.txt new file mode 100644 index 00000000..0218722e --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/09-models.headers.txt @@ -0,0 +1,9 @@ +HTTP/1.1 200 OK +Content-Type: application/json; charset=utf-8 +Referrer-Policy: strict-origin-when-cross-origin +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: c8cd5b63-e8ac-4073-ad18-93c38f5fb29f +Date: Tue, 26 May 2026 21:17:07 GMT +Content-Length: 131 + diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/10-models.body.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/10-models.body.json new file mode 100644 index 00000000..c0e7bee5 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/10-models.body.json @@ -0,0 +1 @@ +{"data":[{"id":"deepseek-chat","type":"model","display_name":"deepseek-chat","created_at":"2024-01-01T00:00:00Z"}],"object":"list"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/11-chat.headers.txt b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/11-chat.headers.txt new file mode 100644 index 00000000..6f665f98 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/11-chat.headers.txt @@ -0,0 +1,10 @@ +HTTP/1.1 200 OK +Content-Type: application/json +Date: Tue, 26 May 2026 21:17:10 GMT +Referrer-Policy: strict-origin-when-cross-origin +Vary: origin, access-control-request-method, access-control-request-headers +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-Request-Id: 23605962-ebb8-4cc8-87c5-395067697dd8 +Content-Length: 502 + diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/12-chat.body.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/12-chat.body.json new file mode 100644 index 00000000..b90e719c --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/12-chat.body.json @@ -0,0 +1 @@ +{"id":"da5722ac-e156-4b3f-9949-6f95bd2a9fe4","object":"chat.completion","created":1779830230,"model":"deepseek-v4-flash","choices":[{"index":0,"message":{"role":"assistant","content":"你好!看起来你只输入了“"},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":5,"completion_tokens":8,"total_tokens":13,"prompt_tokens_details":{"cached_tokens":0},"prompt_cache_hit_tokens":0,"prompt_cache_miss_tokens":5},"system_fingerprint":"fp_8b330d02d0_prod0820_fp8_kvcache_20260402"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/13-provider-status.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/13-provider-status.json new file mode 100644 index 00000000..99f29eca --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/13-provider-status.json @@ -0,0 +1 @@ +{"access_closures_count":1,"batch":{"access_status":"subscription_ready","batch_status":"partially_succeeded","id":34,"mode":"partial"},"host":{"base_url":"http://127.0.0.1:18139","host_id":"remote43-patched-18139","host_version":"0.1.126"},"latest_access_status":"subscription_ready","latest_reconcile_status":"not_run","latest_reconcile_summary":{},"managed_resources_count":4,"pack":{"pack_id":"openai-cn-pack","version":"1.1.4"},"provider":{"display_name":"DeepSeek Chat 官方兼容","platform":"openai","provider_id":"deepseek-chat-official"},"provider_status":"partially_succeeded","reconcile_runs_count":0} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/14-access-status.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/14-access-status.json new file mode 100644 index 00000000..d219c613 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/14-access-status.json @@ -0,0 +1 @@ +{"batch_access_status":"subscription_ready","batch_id":34,"closures_count":1,"latest_access_status":"subscription_ready","latest_closure":{"closure_type":"subscription","details_json":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"25467a60-904b-430d-8c6b-a40a3e30e828\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779830221,\\\"model\\\":\\\"deepseek-v4-flash\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"你好!看起来你只输入了“\\\"},\\\"logprobs\\\":null,\\\"finish_reason\\\":\\\"length\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":5,\\\"completion_tokens\\\":8,\\\"total_tokens\\\":13,\\\"prompt_tokens_details\\\":{\\\"cached_tokens\\\":0},\\\"prompt_cache_hit_token\",\"completion_status\":200,\"completion_type\":\"application/json\",\"effective_probe_key_fingerprint\":\"sha256:cd65766a8ecd833a5eb4cba4d21b89d319ee6028c63787b67c3c828c0c1ad597\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-chat\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779829190-3150ea83\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"2\"]}","id":35,"status":"subscription_ready"},"pack_id":"openai-cn-pack","provider_id":"deepseek-chat-official"} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/15-access-preview.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/15-access-preview.json new file mode 100644 index 00000000..ce60f791 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/15-access-preview.json @@ -0,0 +1 @@ +{"provider_id":"deepseek-chat-official","mode":"subscription","available":true,"message":"latest access status: subscription_ready"} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/16-batch-detail-final.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/16-batch-detail-final.json new file mode 100644 index 00000000..5c97793d --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/16-batch-detail-final.json @@ -0,0 +1 @@ +{"access_closures":[{"ID":35,"BatchID":34,"ClosureType":"subscription","Status":"subscription_ready","DetailsJSON":"{\"completion_ok\":true,\"completion_preview\":\"{\\\"id\\\":\\\"25467a60-904b-430d-8c6b-a40a3e30e828\\\",\\\"object\\\":\\\"chat.completion\\\",\\\"created\\\":1779830221,\\\"model\\\":\\\"deepseek-v4-flash\\\",\\\"choices\\\":[{\\\"index\\\":0,\\\"message\\\":{\\\"role\\\":\\\"assistant\\\",\\\"content\\\":\\\"你好!看起来你只输入了“\\\"},\\\"logprobs\\\":null,\\\"finish_reason\\\":\\\"length\\\"}],\\\"usage\\\":{\\\"prompt_tokens\\\":5,\\\"completion_tokens\\\":8,\\\"total_tokens\\\":13,\\\"prompt_tokens_details\\\":{\\\"cached_tokens\\\":0},\\\"prompt_cache_hit_token\",\"completion_status\":200,\"completion_type\":\"application/json\",\"effective_probe_key_fingerprint\":\"sha256:cd65766a8ecd833a5eb4cba4d21b89d319ee6028c63787b67c3c828c0c1ad597\",\"effective_probe_key_source\":\"managed_subscription\",\"has_expected_model\":true,\"models\":[\"deepseek-chat\"],\"ok\":true,\"requested_probe_api_key\":\"sk-1779829190-3150ea83\",\"status_code\":200,\"subscription_days\":30,\"subscription_users\":[\"2\"]}"}],"access_count":1,"batch":{"access_status":"subscription_ready","batch_status":"partially_succeeded","host_id":4,"id":34,"mode":"partial","pack_id":1,"provider_id":36},"items":[{"account_status":"failed","batch_id":34,"id":30,"key_fingerprint":"sha256:90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293","probe_summary_json":"{\"account_id\":\"1\",\"models\":[{\"id\":\"deepseek-chat\",\"display_name\":\"deepseek-chat\",\"type\":\"model\"}],\"probe_advisory\":false,\"probe_message\":\"API returned 404:\",\"probe_ok\":false,\"probe_status\":\"failed\",\"smoke_model_seen\":true,\"validation_status\":\"failed\"}"}],"items_count":1,"managed_count":4,"managed_resources":[{"ID":74,"BatchID":34,"HostID":4,"ResourceType":"group","HostResourceID":"2","ResourceName":"DeepSeek Chat 官方默认分组-subscription"},{"ID":75,"BatchID":34,"HostID":4,"ResourceType":"channel","HostResourceID":"1","ResourceName":"DeepSeek Chat 官方默认渠道-subscription"},{"ID":76,"BatchID":34,"HostID":4,"ResourceType":"plan","HostResourceID":"1","ResourceName":"DeepSeek Chat 官方默认套餐-subscription"},{"ID":77,"BatchID":34,"HostID":4,"ResourceType":"account","HostResourceID":"1","ResourceName":"deepseek-chat-official-01"}],"reconcile_count":0,"reconcile_runs":[]} diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/17-upstream-models.headers.txt b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/17-upstream-models.headers.txt new file mode 100644 index 00000000..a4625d92 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/17-upstream-models.headers.txt @@ -0,0 +1,15 @@ +HTTP/2 200 +content-type: application/json +content-length: 156 +date: Tue, 26 May 2026 21:17:14 GMT +server: elb +vary: origin, access-control-request-method, access-control-request-headers +access-control-allow-credentials: true +x-ds-trace-id: 267cee1e39ceb9dffb66fc92c1c50e04 +strict-transport-security: max-age=31536000; includeSubDomains; preload +x-content-type-options: nosniff +x-cache: Miss from cloudfront +via: 1.1 10308614253d837e130737d51fedbb5c.cloudfront.net (CloudFront) +x-amz-cf-pop: ICN53-P1 +x-amz-cf-id: dLgjjOecNGtb43zJmeWWP2U9X5wTQScUIte6Up7An-O8hrBIrvNkEQ== + diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/18-upstream-models.body.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/18-upstream-models.body.json new file mode 100644 index 00000000..4339c413 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/18-upstream-models.body.json @@ -0,0 +1 @@ +{"object":"list","data":[{"id":"deepseek-v4-flash","object":"model","owned_by":"deepseek"},{"id":"deepseek-v4-pro","object":"model","owned_by":"deepseek"}]} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/19-upstream-chat.headers.txt b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/19-upstream-chat.headers.txt new file mode 100644 index 00000000..add13a2b --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/19-upstream-chat.headers.txt @@ -0,0 +1,14 @@ +HTTP/2 200 +content-type: application/json +date: Tue, 26 May 2026 21:17:17 GMT +x-content-type-options: nosniff +server: elb +vary: origin, access-control-request-method, access-control-request-headers +access-control-allow-credentials: true +x-ds-trace-id: 4ad1146c3bfb63dfdf03f618717e28e1 +strict-transport-security: max-age=31536000; includeSubDomains; preload +x-cache: Miss from cloudfront +via: 1.1 b77970b443b85c3870297f35a5741294.cloudfront.net (CloudFront) +x-amz-cf-pop: ICN53-P1 +x-amz-cf-id: SOGbD2KayzBA2KBjv7YwZv24srNI-qSnJZ52nQlDttIdkYtS9scgeg== + diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/20-upstream-chat.body.txt b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/20-upstream-chat.body.txt new file mode 100644 index 00000000..efb292cc --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/20-upstream-chat.body.txt @@ -0,0 +1 @@ +{"id":"24da9c56-26fc-4519-8df6-6496476fff48","object":"chat.completion","created":1779830237,"model":"deepseek-v4-flash","choices":[{"index":0,"message":{"role":"assistant","content":"你好!看起来你只输入了“"},"logprobs":null,"finish_reason":"length"}],"usage":{"prompt_tokens":5,"completion_tokens":8,"total_tokens":13,"prompt_tokens_details":{"cached_tokens":0},"prompt_cache_hit_tokens":0,"prompt_cache_miss_tokens":5},"system_fingerprint":"fp_8b330d02d0_prod0820_fp8_kvcache_20260402"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/21-summary.json b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/21-summary.json new file mode 100644 index 00000000..ebfe2091 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/21-summary.json @@ -0,0 +1 @@ +{"artifact_dir": "/home/long/project/sub2api-cn-relay-manager/artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import", "provider_id": "deepseek-chat-official", "batch_id": 34, "batch_status": "partially_succeeded", "access_status_from_import": "subscription_ready", "provider_status_from_import": "degraded", "direct_models_http200": true, "direct_models_has_expected_model": true, "direct_models": ["deepseek-chat"], "direct_chat_http200": true, "direct_chat_status": 200, "upstream_models": ["deepseek-v4-flash", "deepseek-v4-pro"], "upstream_models_has_expected_model": false, "upstream_chat_status": 200, "completion_classification": "unknown", "latest_access_status": "subscription_ready", "preview_available": true, "accepted_keys_count": 1, "subscription_group_id": "2", "import_group_id": "2"} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/01-runtime-context.json b/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/01-runtime-context.json new file mode 100644 index 00000000..928963eb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18088", + "host_base": "http://127.0.0.1:18139", + "crm_host_base": "http://127.0.0.1:18139", + "remote_host_base": "http://127.0.0.1:18139", + "provider_id": "deepseek-chat-official", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "be6c", + "fingerprint": "f569c7392bf24c6fee959b834582e542fd60d1f9fb388d8766237ebae252064b" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/01a-create-host.json b/artifacts/real-host-acceptance/20260527_052505_remote43_deepseek-chat-official_key_import/01a-create-host.json new file mode 100644 index 00000000..e69de29b diff --git a/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01-runtime-context.json b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01-runtime-context.json new file mode 100644 index 00000000..928963eb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18088", + "host_base": "http://127.0.0.1:18139", + "crm_host_base": "http://127.0.0.1:18139", + "remote_host_base": "http://127.0.0.1:18139", + "provider_id": "deepseek-chat-official", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "be6c", + "fingerprint": "f569c7392bf24c6fee959b834582e542fd60d1f9fb388d8766237ebae252064b" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01a-create-host.json b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01a-create-host.json new file mode 100644 index 00000000..5eb0fd7c --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-patched-18139", "base_url": "http://127.0.0.1:18139", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/02-import.headers.txt b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/02-import.headers.txt new file mode 100644 index 00000000..f9d51032 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 502 Bad Gateway +Content-Type: application/json +Date: Tue, 26 May 2026 21:35:32 GMT +Content-Length: 466 + diff --git a/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/03-import.body.json b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/03-import.body.json new file mode 100644 index 00000000..83bfa7f9 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":0,"access_status":"","accounts_count":0,"batch_id":0,"batch_status":"","error":{"code":"host_request_failed","message":"get host version: sub2api GET /api/v1/admin/system/version returned 401: {\"code\":\"INVALID_TOKEN\",\"message\":\"Invalid token\"}","upstream_status":401},"gateway":{"ok":false,"status_code":0,"models":null,"has_expected_model":false,"completion_ok":false,"completion_status":0},"host_overlays":null,"provider_status":""} diff --git a/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260527_053526_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json new file mode 100644 index 00000000..e69de29b diff --git a/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/00-local-key-source.json b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/00-local-key-source.json new file mode 100644 index 00000000..d42a0bbb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/00-local-key-source.json @@ -0,0 +1,10 @@ +{ + "source": "env:DEEPSEEK_OFFICIAL_API_KEY", + "provider_id": "deepseek-chat-official", + "redacted": { + "present": true, + "prefix": "sk-e", + "suffix": "1e0c", + "fingerprint": "90c67389f5e0fc2b2c41374af34156f7e696333bb5976a7c5b864d77f537c293" + } +} diff --git a/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01-runtime-context.json b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01-runtime-context.json new file mode 100644 index 00000000..928963eb --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01-runtime-context.json @@ -0,0 +1,16 @@ +{ + "crm_base": "http://127.0.0.1:18088", + "host_base": "http://127.0.0.1:18139", + "crm_host_base": "http://127.0.0.1:18139", + "remote_host_base": "http://127.0.0.1:18139", + "provider_id": "deepseek-chat-official", + "subscription_group_id": null, + "import_group_id": null, + "subscription_user_id_hash": "4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a", + "subscription_user_key": { + "present": true, + "prefix": "sk-1", + "suffix": "be6c", + "fingerprint": "f569c7392bf24c6fee959b834582e542fd60d1f9fb388d8766237ebae252064b" + } +} \ No newline at end of file diff --git a/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01a-create-host.json b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01a-create-host.json new file mode 100644 index 00000000..5eb0fd7c --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/01a-create-host.json @@ -0,0 +1 @@ +{"host_id": "remote43-patched-18139", "base_url": "http://127.0.0.1:18139", "host_version": "0.1.126", "auth_type": "bearer", "status": "unsupported", "capabilities": {"groups": true, "channels": true, "plans": true, "accounts": true, "account_test": false, "account_models": true, "subscriptions": true}} diff --git a/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/02-import.headers.txt b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/02-import.headers.txt new file mode 100644 index 00000000..10722831 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/02-import.headers.txt @@ -0,0 +1,5 @@ +HTTP/1.1 502 Bad Gateway +Content-Type: application/json +Date: Tue, 26 May 2026 21:38:37 GMT +Content-Length: 466 + diff --git a/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/03-import.body.json b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/03-import.body.json new file mode 100644 index 00000000..83bfa7f9 --- /dev/null +++ b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/03-import.body.json @@ -0,0 +1 @@ +{"accepted_keys_count":0,"access_status":"","accounts_count":0,"batch_id":0,"batch_status":"","error":{"code":"host_request_failed","message":"get host version: sub2api GET /api/v1/admin/system/version returned 401: {\"code\":\"INVALID_TOKEN\",\"message\":\"Invalid token\"}","upstream_status":401},"gateway":{"ok":false,"status_code":0,"models":null,"has_expected_model":false,"completion_ok":false,"completion_status":0},"host_overlays":null,"provider_status":""} diff --git a/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json b/artifacts/real-host-acceptance/20260527_053832_remote43_deepseek-chat-official_key_import/04-batch-detail-initial.json new file mode 100644 index 00000000..e69de29b diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 00000000..4b476565 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,25 @@ +# deploy 目录说明 + +日期:2026-05-27 + +`deploy/` 用来存放**部署目标会直接消费**的静态资产或配置模板。 + +当前内容: + +- `tksea-portal/index.html` + - `https://sub.tksea.top/portal/` 的静态页面源码 +- `tksea-portal/nginx.sub.tksea.top.conf.example` + - `sub.tksea.top` 上 portal 路由与代理示例 + +它和 `scripts/` 的边界如下: + +- `deploy/` + - 放静态页、Nginx/Caddy/Env 模板、会被复制到目标机上的文件 +- `scripts/` + - 放执行复制、部署、reload、验收的脚本 + +当前对应关系: + +- 资产:`deploy/tksea-portal/*` +- 部署脚本:`scripts/deploy/deploy_tksea_portal.sh` +- 资产回归:`scripts/test/test_tksea_portal_assets.sh` diff --git a/deploy/tksea-portal/index.html b/deploy/tksea-portal/index.html new file mode 100644 index 00000000..aabd8401 --- /dev/null +++ b/deploy/tksea-portal/index.html @@ -0,0 +1,1298 @@ + + + + + + Sub2API 多模型接入中心 + + + +
+
+
+ Sub2API 公网多模型接入中心 + 兼容 OpenAI root endpoint + 旧地址 /kimi-portal 自动跳转 +
+

一个入口,管理你的多模型测试账号、线路与 Key

+
+

这里不再只是 Kimi 入口,而是统一承接当前公网多模型接入。登录后,你可以直接看到账号状态、已开通线路、活跃订阅和历史 Key,并按所需模型族快速创建新的测试 Key。

+

同一个公网 endpoint 支持多模型接入,但 key 仍按分组发放。页面会明确告诉你哪些线路可以直接使用,哪些还需要管理员补开通。

+
+
+
+ 推荐 Base URL +
https://sub.tksea.top
+
+
+ 显式 /v1 Base URL +
https://sub.tksea.top/v1
+
+
+ 通用 Portal 地址 +
https://sub.tksea.top/portal/
+
+
+
+ +
+
+
+
+
+

会话状态

+

登录后会自动恢复会话,并同步当前用户信息、可用线路、订阅状态和历史 Key。

+
+
+ 未登录 + + +
+
+
+
+ 账户余额 +
--
+
+
+ 已开通分组 +
0
+
+
+ 活跃订阅 +
0
+
+
+ 已有 Key +
0
+
+
+
+
+ +
+
+
+

分组与模型线路

+

这里会把你的可用分组、活跃订阅和模型目录合并展示,让“能不能用、该用哪条线”一眼可见。

+
+
+
+
+ +
+
+
+

已有 Key

+

历史 Key 默认只展示必要信息;你可以直接在列表里一键复制,无需先重新创建。

+
+
GET /api/v1/keys?page=1&page_size=20
+
+
+
+
+ +
+
+
+
+

注册与登录

+

刷新页面或稍后回来,都可以直接登录恢复会话。首次注册成功后会自动登录,并回填邮箱。

+
+
+
+
+

注册

+

当前无需邮箱验证码、邀请码或 Turnstile。

+ + + + +
+ +
+
未执行
+
+ +
+

登录

+

如果你已经有账号,可以直接登录并同步当前用户状态。

+ + + + +
+ +
+
未执行
+
+
+
+ +
+
+
+

创建测试 Key

+

页面会高亮你当前可用的线路,创建成功后立即显示对应分组和模型建议。

+
+
+
+
+ + +
+
+ + +
+
+
+ +
+
未执行
+
+ +
+
+
+

结果与接入信息

+

创建成功后,这里会显示 Access Token、最新 API Key,以及这一把 key 对应的分组和推荐模型。

+
+
+
+
+ Access Token + +
+ +
+
+
+ 最新创建的 API Key + +
+ +
+
+
+ 当前线路说明 +
尚未选择线路。
+
+
+ 推荐配置 +
base_url = https://sub.tksea.top
+
或 base_url = https://sub.tksea.top/v1
+
model = 按当前分组对应模型名填写
+
api_key = 你刚生成的 key
+
+
+ +
+
+
+
+
+ + + + diff --git a/deploy/tksea-portal/nginx.sub.tksea.top.conf.example b/deploy/tksea-portal/nginx.sub.tksea.top.conf.example new file mode 100644 index 00000000..e8c23edf --- /dev/null +++ b/deploy/tksea-portal/nginx.sub.tksea.top.conf.example @@ -0,0 +1,63 @@ +# sub.tksea.top portal routing example +# +# 说明: +# - /portal/ 是新的通用多模型接入中心地址 +# - /kimi-portal 与 /kimi-portal/ 保留 302 跳转,避免旧链接失效 +# - /portal-proxy/ 是页面调用宿主用户态 API 的同域代理 +# - /kimi/ 与 /kimi-v1/ 继续保留,兼容旧的 Kimi 专用客户端配置 + +location = /portal { + return 302 /portal/; +} + +location = /kimi-portal { + return 302 /portal/; +} + +# BEGIN sub2api-portal +location /portal/ { + alias /var/www/sub2api-portal/; + index index.html; + try_files $uri $uri/ /portal/index.html; +} + +location /portal-proxy/ { + proxy_pass http://127.0.0.1:18169/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; +} + +location /kimi-portal/ { + return 302 /portal/; +} + +location /kimi-portal-proxy/ { + proxy_pass http://127.0.0.1:18169/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; +} + +location /kimi/ { + proxy_pass http://127.0.0.1:18169/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; +} + +location /kimi-v1/ { + proxy_pass http://127.0.0.1:18169/v1/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; +} +# END sub2api-portal diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 46ddb18c..e3b5ec5a 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -46,6 +46,24 @@ SUB2API_CRM_ADMIN_TOKEN=change-me-before-production SUB2API_CRM_LISTEN_ADDR=127. | `SUB2API_CRM_LISTEN_ADDR` | 监听地址 | `:18081` | | `SUB2API_CRM_SQLITE_DSN` | SQLite DSN | `file:/tmp/sub2api-cn-relay-manager.db?_foreign_keys=on&_busy_timeout=5000` | +## 公网 Portal 资产 + +如果你还需要同时维护 `sub.tksea.top` 上的用户态 portal,不要再把静态页或 Nginx 规则只放在 `/tmp`: + +- 静态页源码:`deploy/tksea-portal/index.html` +- Nginx 示例:`deploy/tksea-portal/nginx.sub.tksea.top.conf.example` +- 部署脚本:`scripts/deploy/deploy_tksea_portal.sh` +- 资产回归:`scripts/test/test_tksea_portal_assets.sh` + +当前正式入口: + +- `https://sub.tksea.top/portal/` + +兼容入口: + +- `https://sub.tksea.top/kimi-portal/` + - 当前应保持跳转到 `/portal/` + ## 上线前验证 ```bash diff --git a/docs/EXECUTION_BOARD.md b/docs/EXECUTION_BOARD.md index 1da85495..ced0a766 100644 --- a/docs/EXECUTION_BOARD.md +++ b/docs/EXECUTION_BOARD.md @@ -15,6 +15,18 @@ - `self_service` 主链路已通过 latest-head 标准 fresh-host 复验: - `artifacts/real-host-acceptance/20260521_210403/05-import.json` - `artifacts/real-host-acceptance/20260521_210403/07-access-status.json` +- 2026-05-27 已把公网用户入口从 `kimi-portal` 收口为通用多模型 portal: + - 新正式地址:`https://sub.tksea.top/portal/` + - 旧地址 `https://sub.tksea.top/kimi-portal/` 当前保留为 `302` 跳转,避免历史分享链接失效 + - 站点资产与 Nginx 路由不再只存在 `/tmp` 临时文件,已收口进仓库: + - `deploy/tksea-portal/index.html` + - `deploy/tksea-portal/nginx.sub.tksea.top.conf.example` + - `scripts/deploy/deploy_tksea_portal.sh` + - 新页面已补齐登录态、用户信息、可绑定分组、活跃订阅、历史 key 列表,以及“新创建 key 对应分组/模型”的即时展示 + - 线上无副作用验收已确认: + - `GET /portal/` 返回 `200` + - `GET /kimi-portal/` 返回 `302 -> /portal/` + - `GET /portal-proxy/api/v1/keys` 在无效 token 下已命中宿主真实 `INVALID_TOKEN`,说明新的同域代理已生效 - 2026-05-26 已把“最终用户 -> 公网域名 -> OpenClaw”这一跳补进正式验证口径: - 公网根地址当前统一为 `https://sub.tksea.top` - OpenClaw 本地 `MiniMax` 运行时故障已定位为 `pi-ai/openai-node` 未继承系统 `HTTP(S)_PROXY`,不是 allowlist 或模型名大小写问题 @@ -38,12 +50,12 @@ - 旧 artifact `artifacts/real-host-acceptance/20260526_155810_remote43_deepseek_chat_official_multi_model_rootprep/21-summary.json` 停在 `partially_succeeded/degraded` - 2026-05-27 rerun `artifacts/real-host-acceptance/20260527_051655_remote43_deepseek-chat-official_key_import/21-summary.json` 已确认本机经 remote43 patched host 的真实数据面恢复:`direct_models_http200=true`、`direct_models=["deepseek-chat"]`、`direct_chat_status=200`、`latest_access_status=subscription_ready`、`upstream_chat_status=200` - 剩余 `partially_succeeded/degraded` 的唯一原因已定位为宿主 account probe 返回裸 `API returned 404:`,而后续 gateway `/v1/models` + `/v1/chat/completions` 实际都已通过;HEAD 现已把该 404 视为 advisory,不再阻塞最终状态收敛 - - 同轮还补上 remote43 scripted stack 的真实脚本缺陷:`.env.crm` 里的 SQLite DSN 含 `&_busy_timeout=5000` 时,旧版未做 shell escape,`source .env.crm` 会吞掉 `SUB2API_CRM_SQLITE_DSN`,导致 remote CRM 实际退回默认 DB 路径;`scripts/remote43_patched_stack_lib.sh` 已修复并有回归测试覆盖 + - 同轮还补上 remote43 scripted stack 的真实脚本缺陷:`.env.crm` 里的 SQLite DSN 含 `&_busy_timeout=5000` 时,旧版未做 shell escape,`source .env.crm` 会吞掉 `SUB2API_CRM_SQLITE_DSN`,导致 remote CRM 实际退回默认 DB 路径;`scripts/deploy/remote43_patched_stack_lib.sh` 已修复并有回归测试覆盖 - latest-head relay-manager 已新增宿主 capability 自愈: - 当第三方 OpenAI-compatible upstream 因宿主把 `openai_responses_supported` 误判成 `true` 而导致 host `/v1/chat/completions` 返回 `502 upstream_error` 时,access closure 与后台 reconcile 会自动把相关 account 修正到 raw `/chat/completions` 路径后再重试 - 但这条控制面自愈当前仍不足以单独收敛本地 stock `weishaw/sub2api:0.1.129` + `kimi-a7m` 场景;`artifacts/real-host-acceptance/20260525_local_v0129_kimi_a7m_scheme_c_stockhost_rerun/21-summary.json` 已再次证明:在不改宿主源码的前提下,managed `/v1/models` 虽然命中 `kimi-k2.6`,`/v1/chat/completions` 仍会落到 `502 upstream_error`,所以该 case 仍需宿主运行时兼容补丁或 shim - 2026-05-23 remote43 线上验收脚本已继续收口: - - `scripts/import_remote43_provider.sh` 现已明确拆分 `CRM_HOST_BASE` 与 `REMOTE_HOST_BASE` + - `scripts/acceptance/import_remote43_provider.sh` 现已明确拆分 `CRM_HOST_BASE` 与 `REMOTE_HOST_BASE` - 远端 Postgres / Redis 容器已改成按目标宿主端口自动解析,不再硬编码落到 `sub2api-relaymgr-pg/redis` - 远端 managed probe `/v1/models` 与 `/v1/chat/completions` 已改成只走 `REMOTE_HOST_BASE` - provider status / access status / access preview 末尾查询已补 `host_id`,避免本地 CRM 有多宿主历史时被 `provider exists on multiple hosts` 截断 @@ -65,14 +77,14 @@ - `artifacts/real-host-acceptance/20260525_remote43_kimi_a7m_patched_overlay_freshhost_remotecrm/21-summary.json` 已确认:`batch_status=succeeded`、`access_status_from_import=subscription_ready`、`provider_status_from_import=active`、`direct_models_http200=true`、`direct_chat_http200=true`、`upstream_chat_status=200` - 同目录 `14-access-status.json` 已确认 `effective_probe_key_source=managed_subscription` 且 `completion_status=200` - remote43 宿主日志也已落到真实 `GET /v1/models = 200`、`POST /v1/chat/completions = 200`,说明这条 patched overlay 路线不只在本地 fresh-host 成功,也已在远端真实环境收敛到 ready - - 这轮还顺手修掉了 `scripts/import_remote43_provider.sh` 的一个真实脚本缺陷:查找未分配 `relay-sub-*` 用户时,`NOT EXISTS` 子查询错误引用了无 alias 的 `users.id`,在 PostgreSQL 上会报 `invalid reference to FROM-clause entry for table "users"` + - 这轮还顺手修掉了 `scripts/acceptance/import_remote43_provider.sh` 的一个真实脚本缺陷:查找未分配 `relay-sub-*` 用户时,`NOT EXISTS` 子查询错误引用了无 alias 的 `users.id`,在 PostgreSQL 上会报 `invalid reference to FROM-clause entry for table "users"` - 2026-05-25 继续把这套 remote43 patched-host / remote CRM 的启动流程脚本化: - - 新增 `scripts/setup_remote43_patched_stack.sh`,把 pack 镜像、二进制上传、remote43 上的 PG/Redis/patched host/临时 CRM 拉起、以及本地 operator env / SSH 隧道提示收口为一个固定入口 - - 新增 `scripts/remote43_patched_stack_lib.sh`,把远端 host env / CRM env / bootstrap script 渲染逻辑抽成可测试 helper - - `scripts/test_real_host_scripts.sh` 已新增对应回归,避免以后再回退到手工 `/tmp/*.sh` 拼装 + - 新增 `scripts/deploy/setup_remote43_patched_stack.sh`,把 pack 镜像、二进制上传、remote43 上的 PG/Redis/patched host/临时 CRM 拉起、以及本地 operator env / SSH 隧道提示收口为一个固定入口 + - 新增 `scripts/deploy/remote43_patched_stack_lib.sh`,把远端 host env / CRM env / bootstrap script 渲染逻辑抽成可测试 helper + - `scripts/test/test_real_host_scripts.sh` 已新增对应回归,避免以后再回退到手工 `/tmp/*.sh` 拼装 - 脚本首轮真实演练暴露出一个运行态细节:patched `sub2api` 二进制实际监听 `8080`,不能沿用旧临时脚本里的 `127.0.0.1:$HOST_PORT:3000` 端口映射;当前 `setup_remote43_patched_stack.sh` 已新增 `HOST_CONTAINER_PORT=8080` 默认值并完成 remote43 二次实跑验证 - 用修复后的固定脚本在 remote43 新起的 `sub2api-kimi-patched-auto2-20260525` 栈上,`kimi-a7m` 再次完成真实导入主链路:`artifacts/real-host-acceptance/20260525_remote43_kimi_a7m_patched_overlay_scripted_stack/03-import.body.json` 已确认 `batch_status=succeeded`、`access_status=subscription_ready`、`provider_status=active`,同目录 `10-models.body.json` / `12-chat.body.json` / `18-upstream-models.body.json` / `20-upstream-chat.body.txt` 也已再次证明 managed 与 upstream 双侧都回到 `HTTP 200` - - 2026-05-26 继续把 scripted stack 的末尾状态查询收口为稳定契约:`scripts/import_remote43_provider.sh` 末尾不再只传 `host_id`,而是显式拼上 `pack_id=openai-cn-pack&host_id=`;修复原因是 remote43 上同一个 provider 可能存在多个 pack 版本,缺 `pack_id` 时 `/api/providers/{providerID}/status` 会返回 `400 provider exists in multiple packs; pack_id is required` + - 2026-05-26 继续把 scripted stack 的末尾状态查询收口为稳定契约:`scripts/acceptance/import_remote43_provider.sh` 末尾不再只传 `host_id`,而是显式拼上 `pack_id=openai-cn-pack&host_id=`;修复原因是 remote43 上同一个 provider 可能存在多个 pack 版本,缺 `pack_id` 时 `/api/providers/{providerID}/status` 会返回 `400 provider exists in multiple packs; pack_id is required` - 修复后,`artifacts/real-host-acceptance/20260526_remote43_kimi_a7m_patched_overlay_scripted_stack_rerun2/13-provider-status.json`、`14-access-status.json`、`21-summary.json` 已全部自动补齐;其中 `21-summary.json` 已再次确认 `batch_status=succeeded`、`provider_status_from_import=active`、`latest_access_status=subscription_ready`、`direct_chat_status=200`、`upstream_chat_status=200` - `artifacts/real-host-acceptance/20260525_local_v0129_kimi_a7m_from_hermes/21-summary.json` 已证明: - Hermes 本机 `A7M_KIMI_API_KEY` 直探 upstream `/v1/models` 与 `/v1/chat/completions` 均为 `200` @@ -133,7 +145,7 @@ - 新增 `docs/2026-05-18-PRODUCTION_REMEDIATION_TASK_BOARD.md` - 下调 `DEPLOYMENT.md` 中未实现的 `/metrics` / 限流 / 监控承诺 7. current-code remote43 导入链路已补齐 tunnel-aware 验证能力 - - `scripts/import_remote43_provider.sh` 新增 `CRM_HOST_BASE`,允许把“operator 访问 host 地址”和“CRM 进程访问 host 地址”分离 + - `scripts/acceptance/import_remote43_provider.sh` 新增 `CRM_HOST_BASE`,允许把“operator 访问 host 地址”和“CRM 进程访问 host 地址”分离 - 历史 live model-mapping 关键证据保留在:`artifacts/real-host-acceptance/20260520_222713_crm18100_live_model_mapping_validation` 8. current-code remote43 access gate 根因修正已落地 - subscription access 改为宿主侧闭环:CRM 不再依赖外部预先给定的宿主普通用户 key,而是按 `subscription_users` selector 在宿主创建/查找托管普通用户、登录创建托管 key、回写 allowed_groups / balance、再执行订阅分配 @@ -145,7 +157,7 @@ - access closure / import runtime artifact / reconcile rerun payload 都会持久化 `completion_ok/completion_status/completion_type/completion_preview` 10. current-code remote43 验收脚本已补 upstream API 证据层 -- `scripts/import_remote43_provider.sh` 会直探 provider `base_url` 对应的 upstream `/models` 与 `/chat/completions` +- `scripts/acceptance/import_remote43_provider.sh` 会直探 provider `base_url` 对应的 upstream `/models` 与 `/chat/completions` - 新增 `21-summary.json`,用于把 completion 失败自动分流成 `host_compatibility_gap` 或 `upstream_key_quota_issue` 11. patched CRM external validation 已完成 @@ -191,7 +203,7 @@ - `internal/provision`: `79.4%` - `internal/store/sqlite`: `77.9%` - `go test ./tests/integration/... -count=1` ✅ -- `bash ./scripts/test_real_host_scripts.sh` ✅ +- `bash ./scripts/test/test_real_host_scripts.sh` ✅ ## 当前保留的最终证据 @@ -244,7 +256,7 @@ 2. 部署与环境限制 - 标准多阶段 Dockerfile 在受限网络环境下仍不稳 - - 当前推荐 `scripts/build_local_image.sh` + `Dockerfile.local` + - 当前推荐 `scripts/deploy/build_local_image.sh` + `Dockerfile.local` 3. official provider 验证矩阵 - official MiniMax 当前 live 样本已证明模板链路可用,但验证 key 命中 upstream `429` diff --git a/docs/KNOWN_LIMITATIONS.md b/docs/KNOWN_LIMITATIONS.md index 9cc58ef2..6d3a4200 100644 --- a/docs/KNOWN_LIMITATIONS.md +++ b/docs/KNOWN_LIMITATIONS.md @@ -19,7 +19,7 @@ This document covers known limitations that operators should be aware of before ### 3. Standard Multi-stage Docker Build Still Depends on Outbound Module Download - `Dockerfile.local` has been validated as the recommended proxy-safe build path. -- `scripts/build_local_image.sh` now prebuilds the Linux binary on the host and produces `sub2api-cn-relay-manager:local` reliably in this environment. +- `scripts/deploy/build_local_image.sh` now prebuilds the Linux binary on the host and produces `sub2api-cn-relay-manager:local` reliably in this environment. - The standard multi-stage `Dockerfile` still requires outbound Go module download from inside the container build context; in restricted networks, prefer the local-image path. ## Accepted Design Trade-offs diff --git a/docs/OPENCLAW_EXTERNAL_VALIDATION.md b/docs/OPENCLAW_EXTERNAL_VALIDATION.md new file mode 100644 index 00000000..d9ac3f52 --- /dev/null +++ b/docs/OPENCLAW_EXTERNAL_VALIDATION.md @@ -0,0 +1,358 @@ +# OpenClaw 外部真实验证 + +日期:2026-05-26 + +## 目的 + +这份文档补齐两类长期缺口: + +1. `sub2api-cn-relay-manager` 之外的最终使用面验证 + - 即真实用户拿到宿主 key 后,在本机 `OpenClaw` 上是否真的可用 +2. OpenClaw 本地运行时补丁的可复用操作流程 + - 包括 `MiniMax` 的代理兼容补丁 + - 以及升级后如何自动提醒重新打补丁 + +它不替代: + +- `docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md` + - 负责 `relay-manager -> host -> upstream` 三段验收 +- 本文 + - 负责 `user key -> OpenClaw -> public endpoint` 最后一段真实使用验证 + +## 当前结论 + +截至 2026-05-27,公网根端点已经切到 patched host,可统一按 OpenAI 兼容根地址使用: + +- `base_url=https://sub.tksea.top` +- 若客户端强制要求显式 `/v1`,则使用 `https://sub.tksea.top/v1` + +OpenClaw 当前外部真实验证结论如下: + +| OpenClaw provider | model | base_url | 结果 | 说明 | +| ----------------- | ------------------------ | ---------------------------- | ---- | ------------------------------------------------------- | +| `tksea` | `kimi-k2.6` | `https://sub.tksea.top/kimi` | PASS | 已在 OpenClaw `agent` 路径验证通过 | +| `tksea-gpt` | `gpt-5.4` | `https://sub.tksea.top/v1` | PASS | `openclaw infer model run --local` 返回 `pong` | +| `tksea-gpt` | `gpt-5.4-mini` | `https://sub.tksea.top/v1` | PASS | `openclaw infer model run --local` 返回 `pong` | +| `tksea-gpt` | `gpt-5.5` | `https://sub.tksea.top/v1` | FAIL | upstream 当前返回 `503 Service temporarily unavailable` | +| `tksea-minimax` | `MiniMax-M2.5-highspeed` | `https://sub.tksea.top/v1` | PASS | 对应 remote43 导入 `minimax-53hk` 后的公网消费口径 | +| `tksea-minimax` | `MiniMax-M2.7-highspeed` | `https://sub.tksea.top/v1` | PASS | 对应 remote43 导入 `minimax-53hk` 后的公网消费口径 | +| `minimax53hk` | `MiniMax-M2.5-highspeed` | `https://api.53hk.cn/v1` | PASS | 本地补丁后恢复的 53hk 直连口径 | +| `minimax53hk` | `MiniMax-M2.7-highspeed` | `https://api.53hk.cn/v1` | PASS | 本地补丁后恢复的 53hk 直连口径 | + +与 relay-manager pack 内 `provider_id` 的映射关系当前明确为: + +- `openai-zhongzhuan` → `tksea-gpt` +- `minimax-53hk` → `tksea-minimax` +- `deepseek-chat-official` → `deepseek-official`(2026-05-27 已补齐 `auth-profiles.json`,`openclaw infer model run --model \"deepseek-official/deepseek-chat\" --prompt 'Reply with exactly OK' --json` 返回 `OK`) + +## 前置条件 + +### 远端入口 + +- 用户注册页:`https://sub.tksea.top/portal/` +- 旧地址:`https://sub.tksea.top/kimi-portal/` + - 当前应作为兼容跳转入口保留,而不是继续作为正式主地址 +- 宿主 OpenAI 兼容入口:`https://sub.tksea.top` + +### OpenClaw 本地要求 + +- 已安装 `OpenClaw` +- 本机代理环境可用: + - `HTTP_PROXY` + - `HTTPS_PROXY` +- 已写入至少一种测试 key: + - `tksea` + - `tksea-gpt` + - `tksea-minimax` + - `minimax53hk` + +### 已存在的本地补丁脚本 + +下列脚本当前位于操作者本机,不在本仓库内版本化;本仓库只记录它们的使用方法与验收口径: + +- `~/.openclaw/bin/apply-openclaw-minimax-proxy-fix.sh` +- `~/.openclaw/bin/openclaw-minimax-post-upgrade-check.sh` +- `~/.openclaw/bin/openclaw-minimax-proxy-reminder.sh` +- `~/.openclaw/bin/install-openclaw-minimax-reminder-cron.sh` + +## 根因与补丁范围 + +本轮 `MiniMax` 的 OpenClaw 故障,不是模型名大小写,也不是 allowlist 漏配导致。 + +真实根因是: + +- `curl` 可以通过系统 `HTTP(S)_PROXY` 正常访问 `53hk` 与 `tksea` 的 `MiniMax` +- 但 `OpenClaw -> pi-ai -> openai-node` 默认没有继承同样的代理行为 +- 因此在本地 one-shot 路径里被吞成: + - `No text output returned` + - `Connection error` + +当前补丁做法是: + +- 对本机安装的 `pi-ai` 运行时文件注入 `EnvHttpProxyAgent` +- 让 OpenAI SDK 使用带系统代理的 `fetch` + +补丁目标文件: + +- `~/.local/lib/node_modules/openclaw/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js` + +注意: + +- 这不是本仓库源码补丁 +- `OpenClaw` 升级后,这个补丁可能会被覆盖 + +## 用例设计 + +### 用例 1:提醒任务已安装 + +目的: + +- 确保 OpenClaw 升级后,系统会自动提醒是否需要重新打补丁 + +执行: + +```bash +crontab -l +``` + +预期: + +- 输出中包含: + - `# BEGIN openclaw-minimax-proxy-reminder` + - `@reboot sleep 180 && "~/.openclaw/bin/openclaw-minimax-proxy-reminder.sh" ...` + - `*/30 * * * * "~/.openclaw/bin/openclaw-minimax-proxy-reminder.sh" ...` + +### 用例 2:补丁状态诊断 + +目的: + +- 在升级后先判定当前是否还带着代理补丁 + +执行: + +```bash +~/.openclaw/bin/apply-openclaw-minimax-proxy-fix.sh doctor +``` + +预期: + +- 输出 `OpenClaw` 版本 +- 输出目标 `pi-ai` 文件路径 +- 输出当前 `patched/not_patched` +- 输出 `HTTP_PROXY/HTTPS_PROXY/NO_PROXY` +- 输出备份列表 + +### 用例 3:升级后一键恢复 + +目的: + +- 在 OpenClaw 升级后,自动完成 `doctor -> apply -> verify` + +执行: + +```bash +~/.openclaw/bin/openclaw-minimax-post-upgrade-check.sh +``` + +预期: + +- `doctor` 正常输出 +- `apply` 在已打补丁时表现为幂等 +- `verify` 最终四条 `MiniMax` smoke 全部通过 + +### 用例 4:53hk MiniMax 直连恢复 + +目的: + +- 验证官方宿主之外,老的 `53hk` 线路在 OpenClaw 本地也已恢复 + +执行: + +```bash +openclaw infer model run --local \ + --model "minimax53hk/MiniMax-M2.5-highspeed" \ + --prompt "reply with pong only" \ + --json + +openclaw infer model run --local \ + --model "minimax53hk/MiniMax-M2.7-highspeed" \ + --prompt "reply with pong only" \ + --json +``` + +预期: + +- `ok=true` +- 输出文本为 `pong` + +### 用例 5:tksea MiniMax 真实调用 + +目的: + +- 验证 patched host 暴露的 `MiniMax` 公网入口,已经可被 OpenClaw 正常消费 + +执行: + +```bash +openclaw infer model run --local \ + --model "tksea-minimax/MiniMax-M2.5-highspeed" \ + --prompt "reply with pong only" \ + --json + +openclaw infer model run --local \ + --model "tksea-minimax/MiniMax-M2.7-highspeed" \ + --prompt "reply with pong only" \ + --json +``` + +预期: + +- `ok=true` +- 输出文本为 `pong` + +### 用例 6:tksea GPT 可用模型验证 + +目的: + +- 区分“GPT 配置是否正确”与“某个具体模型当前 upstream 是否可用” + +执行: + +```bash +openclaw infer model run --local \ + --model "tksea-gpt/gpt-5.4" \ + --prompt "reply with pong only" \ + --json + +openclaw infer model run --local \ + --model "tksea-gpt/gpt-5.4-mini" \ + --prompt "reply with pong only" \ + --json +``` + +预期: + +- `gpt-5.4` 返回 `pong` +- `gpt-5.4-mini` 返回 `pong` + +### 用例 7:tksea GPT 不稳定模型验证 + +目的: + +- 把“不稳定模型”显式记录为当前运行态限制,而不是笼统地宣称 GPT 全量可用 + +执行: + +```bash +openclaw infer model run --local \ + --model "tksea-gpt/gpt-5.5" \ + --prompt "reply with pong only" \ + --json +``` + +预期: + +- 当前基线结果是失败 +- 错误为: + - `503 Service temporarily unavailable` + +### 用例 8:DeepSeek 官方 OpenClaw 配置缺口探测 + +目的: + +- 区分“remote43 上 `deepseek-chat-official` 已导入并能 completion”与“本机 OpenClaw 已经可直接消费”这两个结论 + +执行: + +```bash +openclaw infer model run --local \ + --model "deepseek-official/deepseek-chat" \ + --prompt "reply with pong only" \ + --json +``` + +预期: + +- 当前基线结果是失败 +- 失败点不是模型推理,而是本机 auth/profile 尚未就绪 +- 典型错误: + - `No API key found for provider "deepseek-official"` + +## 推荐执行顺序 + +每次 OpenClaw 升级后,按下面顺序执行: + +1. 检查提醒任务 + +```bash +crontab -l +``` + +2. 先诊断当前状态 + +```bash +~/.openclaw/bin/apply-openclaw-minimax-proxy-fix.sh doctor +``` + +3. 再执行升级后一键恢复 + +```bash +~/.openclaw/bin/openclaw-minimax-post-upgrade-check.sh +``` + +4. 验证 `tksea-gpt` 当前可用模型 + +```bash +openclaw infer model run --local --model "tksea-gpt/gpt-5.4" --prompt "reply with pong only" --json +openclaw infer model run --local --model "tksea-gpt/gpt-5.4-mini" --prompt "reply with pong only" --json +``` + +5. 验证 `tksea-minimax` + +```bash +openclaw infer model run --local --model "tksea-minimax/MiniMax-M2.5-highspeed" --prompt "reply with pong only" --json +openclaw infer model run --local --model "tksea-minimax/MiniMax-M2.7-highspeed" --prompt "reply with pong only" --json +``` + +## 诊断分流 + +### `/v1/models` 能出模型,但 OpenClaw 本地仍报 `Connection error` + +优先排查: + +1. `doctor` 是否显示 `patched` +2. 当前 shell 是否存在 `HTTP_PROXY` / `HTTPS_PROXY` +3. OpenClaw 是否刚升级,导致 `pi-ai` patch 丢失 + +### GPT 某个模型失败,但同组其他模型正常 + +优先判断为: + +- 特定模型 upstream 不稳定 +- 不要误判成整个 `tksea-gpt` provider 失效 + +当前基线就是: + +- `gpt-5.4`:PASS +- `gpt-5.4-mini`:PASS +- `gpt-5.5`:FAIL(503) + +### MiniMax API 直连可用,但 OpenClaw 本地失败 + +优先判断为: + +- OpenClaw 本地运行时代理兼容问题 +- 不是宿主 key、也不是 relay-manager 导入问题 + +## 结论口径 + +截至 2026-05-26,当前可以对外采用下面这套简化口径: + +1. patched host 公网根入口已可直接给 OpenAI 兼容客户端使用: + - `https://sub.tksea.top` +2. OpenClaw 的 `MiniMax` 本地运行时兼容问题已经通过代理补丁恢复 +3. `tksea-minimax` 当前可用 +4. `tksea-gpt` 当前不是“全模型可用”,而是: + - `gpt-5.4` 可用 + - `gpt-5.4-mini` 可用 + - `gpt-5.5` 当前仍需视 upstream 状态单独观察 diff --git a/docs/PRODUCTION_CLOSURE_BOARD.md b/docs/PRODUCTION_CLOSURE_BOARD.md index 31d0349d..a88f58f6 100644 --- a/docs/PRODUCTION_CLOSURE_BOARD.md +++ b/docs/PRODUCTION_CLOSURE_BOARD.md @@ -19,13 +19,13 @@ - 汇总证据:`artifacts/real-host-acceptance/20260521_064910_completion_smoke_calibration.md` - 调通细节与经验沉淀:`docs/REAL_HOST_ACCEPTANCE_LEARNINGS.md` - 2026-05-21 当前代码已关闭“models-only 假 ready”问题:access closure / import / reconcile rerun 现在都会在 `/v1/models` 成功后追加一次最小 `POST /v1/chat/completions` smoke;completion 失败的链路不会再被记成 ready。 -- `scripts/import_remote43_provider.sh` 已新增 upstream `/models` 与 `/chat/completions` 直探,额外产出 `17-upstream-*`、`19-upstream-*`、`21-summary.json`,用于把失败分流为 `host_compatibility_gap` 或 `upstream_key_quota_issue`。 +- `scripts/acceptance/import_remote43_provider.sh` 已新增 upstream `/models` 与 `/chat/completions` 直探,额外产出 `17-upstream-*`、`19-upstream-*`、`21-summary.json`,用于把失败分流为 `host_compatibility_gap` 或 `upstream_key_quota_issue`。 - patched CRM live rerun 已验证: - MiniMax 最新 `artifacts/real-host-acceptance/20260521_191418_remote43_minimax_key_import` 已提升到 `batch_status=succeeded`、`provider_status=active` - DeepSeek 最新 `artifacts/real-host-acceptance/20260521_201509_remote43_deepseek_key_import` 也已提升到 `batch_status=succeeded`、`provider_status=active` - latest-head `self_service` 标准 fresh-host 验收 `artifacts/real-host-acceptance/20260521_210403` 已落成 `batch_status=succeeded`、`access_status=self_service_ready`、`provider_status=active`,且 `latest_access_status=fully_ready` - 本轮真正收口的根因修复是:账号 probe SSE 错误消息已保留,CRM 会显式向 `/api/v1/admin/accounts/:id/test` 传 `provider.SmokeTestModel`,瞬时 `429` probe 现在会按 advisory 处理,不再把已通过 gateway closure 的账号批次错误降级,同时 self-service 的 gateway probe 已从错误的 `x-api-key` 切到真实宿主要求的 `Authorization: Bearer` -- 代码/本地运行态门禁已于 2026-05-21 在这轮补丁后再次独立复跑:`gofmt -l .`、`go vet ./...`、`go test ./... -count=1`、`go test -race ./... -count=1`、`go test -cover ./internal/... -count=1`、`go test ./tests/integration/... -count=1`、`bash ./scripts/test_real_host_scripts.sh` 全通过。 +- 代码/本地运行态门禁已于 2026-05-21 在这轮补丁后再次独立复跑:`gofmt -l .`、`go vet ./...`、`go test ./... -count=1`、`go test -race ./... -count=1`、`go test -cover ./internal/... -count=1`、`go test ./tests/integration/... -count=1`、`bash ./scripts/test/test_real_host_scripts.sh` 全通过。 ## 当前门控结论 @@ -43,8 +43,8 @@ | OpenAPI | ✅ SYNCED | `docs/openapi.yaml` 已补当前控制面端点 | | Local runtime smoke | ✅ PASS | `go build ./cmd/{server,cli}`、`GET /healthz`、`GET /api/hosts` | | Local OCI image | ✅ PASS | `docker build -f Dockerfile.local -t sub2api-cn-relay-manager:local .` | -| Real-host acceptance tooling | ✅ READY | `docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md` + `scripts/real_host_acceptance.sh` | -| Harness regression self-check | ✅ PASS | `bash ./scripts/test_real_host_scripts.sh` | +| Real-host acceptance tooling | ✅ READY | `docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md` + `scripts/acceptance/real_host_acceptance.sh` | +| Harness regression self-check | ✅ PASS | `bash ./scripts/test/test_real_host_scripts.sh` | | `self_service` 真实宿主 latest-head fresh host 复验 | ✅ PASS | `artifacts/real-host-acceptance/20260521_210403`:`05-import.json` = `succeeded/self_service_ready/active`,`07-access-status.json` = `latest_access_status=fully_ready` | | `subscription` 真实宿主 patched fresh host 复验 | ✅ PASS | MiniMax:`artifacts/real-host-acceptance/20260521_191418_remote43_minimax_key_import`;DeepSeek:`artifacts/real-host-acceptance/20260521_201509_remote43_deepseek_key_import`;两条 provider 都已证明 current-code 在真实 fresh-host 上可闭环到 `batch_status=succeeded`、`provider_status=active` | | stale CRM / channel pricing 缺口 | ✅ CLOSED | 宿主 `GET /api/v1/admin/channels/5` 与 `/channels/4` 已返回非空 `model_pricing` + `model_mapping` | @@ -69,9 +69,9 @@ - 本地 HTTP smoke 与 `Dockerfile.local` 容器构建已验证通过 4. 补齐上线前执行工具 - - 新增 `scripts/build_local_image.sh`,固化本地/代理环境的镜像构建路径 + - 新增 `scripts/deploy/build_local_image.sh`,固化本地/代理环境的镜像构建路径 - 新增 `docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md` - - 新增 `scripts/real_host_acceptance.sh`,把真实宿主验收固化为可落盘 artifact 的流程 + - 新增 `scripts/acceptance/real_host_acceptance.sh`,把真实宿主验收固化为可落盘 artifact 的流程 5. 当前代码后的最新事实 - 宿主 admin 侧直接复核仍证明 channel `billing_model_source=channel_mapped`、`restrict_models=true`、`model_pricing/model_mapping` 已能被正确写入 @@ -93,7 +93,7 @@ ### P2 已接受技术债务 - `internal/worker` 已抽出通用 polling runner,当前 batch-import runtime 与后台 reconcile 都已接入;调度模型仍是固定间隔 polling,而不是完整 jobs/reconcile 平台 - CLI `run*` 真实链路函数未做系统性 mock 单测 -- 标准多阶段 `Dockerfile` 在受限网络下仍依赖容器内联网拉取 Go modules;本地部署默认走 `scripts/build_local_image.sh` +- 标准多阶段 `Dockerfile` 在受限网络下仍依赖容器内联网拉取 Go modules;本地部署默认走 `scripts/deploy/build_local_image.sh` - `subscription` 这条 provider matrix 已通过;剩余待补的是 latest-head `self_service` fresh-host 复验,而不是继续替换 provider key ## 最短上线闭环 diff --git a/docs/PROJECT_STRUCTURE.md b/docs/PROJECT_STRUCTURE.md new file mode 100644 index 00000000..d138fa83 --- /dev/null +++ b/docs/PROJECT_STRUCTURE.md @@ -0,0 +1,166 @@ +# 项目目录说明 + +日期:2026-05-27 + +## 目的 + +这份文档用于回答两个问题: + +1. 当前仓库各一级目录分别负责什么 +2. 新增文件应该放到哪里,避免继续把运行时脚本、部署资产、验收证据混在一起 + +它不替代 `README.md`,而是补充更细的目录职责说明。 + +## 一级目录 + +### `cmd/` + +程序入口: + +- `cmd/server` + - 控制面 HTTP 服务入口 +- `cmd/cli` + - 导入、overlay、验证等命令行入口 + +### `internal/` + +控制面核心实现,按职责拆分: + +- `internal/access` + - access closure、自愈、gateway 验证 +- `internal/app` + - HTTP API、bootstrap、后台任务 +- `internal/batch` + - batch import 请求与状态投影 +- `internal/config` + - 配置装载 +- `internal/host/sub2api` + - 宿主适配器 +- `internal/overlay` + - host overlay 执行器 +- `internal/pack` + - pack 装载、校验、overlay 解析 +- `internal/probe` + - upstream / host smoke probes +- `internal/provision` + - import / preview / rollback / reconcile 编排 +- `internal/reconcile` + - 后台对账 +- `internal/store` + - SQLite repo 与 migrations +- `internal/testutil` + - 测试辅助 +- `internal/worker` + - 后台 runner + +### `packs/` + +版本化模型包资产: + +- `packs/openai-cn-pack` + - provider manifests + - checksums + - overlay metadata + +这层只放 pack 资产,不放远端站点静态页。 + +### `deploy/` + +面向部署目标的静态资产或配置模板。 + +当前已经纳入: + +- `deploy/tksea-portal/index.html` + - `sub.tksea.top/portal/` 静态页 +- `deploy/tksea-portal/nginx.sub.tksea.top.conf.example` + - 对应 Nginx 路由示例 + +这层的规则是: + +- 放“部署产物模板” +- 不放需要编译的 Go 代码 +- 不放临时 `/tmp` 产物 + +### `scripts/` + +运维、验收、部署脚本,当前已经按用途拆成三层目录: + +- `scripts/deploy/` + - 部署与环境拉起脚本 + - 例如 `build_local_image.sh`、`setup_remote43_patched_stack.sh`、`deploy_tksea_portal.sh` +- `scripts/acceptance/` + - 真实宿主验收与证据处理脚本 + - 例如 `real_host_acceptance.sh`、`import_remote43_provider.sh`、`check_deepseek_completion_split.sh` +- `scripts/test/` + - 脚本资产回归 + - 例如 `test_real_host_scripts.sh`、`test_tksea_portal_assets.sh` + +规则: + +- 只放可执行运维脚本 +- 新脚本必须先判断属于 `deploy/`、`acceptance/` 还是 `test/` +- 脚本依赖的静态模板应尽量放到 `deploy/` 或 `docs/` + +### `docs/` + +所有长期保留文档: + +- 真相入口 +- 执行板 +- 验收 runbook +- provider 矩阵 +- 外部 OpenClaw 验证 +- 目录与部署说明 + +### `tests/` + +集成测试套件: + +- `tests/integration` + +### `artifacts/` + +真实验收产物与归档证据。 + +规则: + +- `artifacts/real-host-acceptance/` + - 当前最终证据 +- `artifacts/real-host-acceptance-archive/` + - 历史调试样本与归档 + +不要把部署模板、静态页、脚本说明放到这里。 + +### `web/` + +保留给未来管理端前端实现。 + +当前公网 portal 已经独立作为 `deploy/tksea-portal/` 静态资产纳管,不应误放进 `web/`,因为它不是控制面管理后台。 + +## 当前推荐放置规则 + +新增文件时,优先按下面规则归类: + +- 新的 provider / pack 元数据 + - 放 `packs/` +- 新的 Go 业务逻辑 + - 放 `internal/` +- 新的 CLI 或 server 入口 + - 放 `cmd/` +- 新的线上静态部署页 / 反向代理模板 + - 放 `deploy/` +- 新的运维或验收命令脚本 + - 放 `scripts/deploy`、`scripts/acceptance` 或 `scripts/test` +- 新的长期说明文档 + - 放 `docs/` +- 新的验收证据 + - 放 `artifacts/` + +## 当前整理结果 + +截至 2026-05-27,最近一轮目录整理主要做了三件事: + +1. 把原来只存在 `/tmp` 的 `sub.tksea.top` portal 静态页与 Nginx 规则正式纳入仓库 +2. 把 portal 部署动作收口到 `scripts/deploy/deploy_tksea_portal.sh` +3. 把 `scripts/` 从全平铺整理为 `deploy/`、`acceptance/`、`test/` 三层,减少脚本入口混杂 +4. 把“公网 portal / OpenClaw / remote43 验收”相关说明分别挂回 `deploy/`、`scripts/`、`docs/` diff --git a/docs/README.md b/docs/README.md index 5e79a5fa..be38a12c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,33 +37,46 @@ - 高频误判点 - 推荐诊断顺序 +7. [OPENCLAW_EXTERNAL_VALIDATION.md](./OPENCLAW_EXTERNAL_VALIDATION.md) + - OpenClaw 最后一跳真实使用验证 + - 升级后补丁自检与 cron 提醒 + - `tksea` / `53hk` 多模型运行态口径 + +8. [PROJECT_STRUCTURE.md](./PROJECT_STRUCTURE.md) + - 当前仓库目录职责说明 + - 新增文件该放在哪一层 + +9. [../scripts/README.md](../scripts/README.md) + - `scripts/deploy`、`scripts/acceptance`、`scripts/test` 的入口说明 + - 继续整理脚本或追脚本回归时先看这里 + ## 背景/设计文档 -6. [PRD.md](./PRD.md) +10. [PRD.md](./PRD.md) - PRD 首版范围 -7. [TDD_PLAN.md](./TDD_PLAN.md) +11. [TDD_PLAN.md](./TDD_PLAN.md) - 测试设计与实现计划 -8. [2026-05-12-sub2api-cn-relay-manager-solution.md](./2026-05-12-sub2api-cn-relay-manager-solution.md) +12. [2026-05-12-sub2api-cn-relay-manager-solution.md](./2026-05-12-sub2api-cn-relay-manager-solution.md) - 早期方案设计与宿主接口理解 -9. [DEPLOYMENT.md](./DEPLOYMENT.md) +13. [DEPLOYMENT.md](./DEPLOYMENT.md) - 部署说明 -10. [KNOWN_LIMITATIONS.md](./KNOWN_LIMITATIONS.md) +14. [KNOWN_LIMITATIONS.md](./KNOWN_LIMITATIONS.md) - 当前限制项 -11. [plans/2026-05-12-sub2api-cn-relay-manager-implementation-plan.md](./plans/2026-05-12-sub2api-cn-relay-manager-implementation-plan.md) +15. [plans/2026-05-12-sub2api-cn-relay-manager-implementation-plan.md](./plans/2026-05-12-sub2api-cn-relay-manager-implementation-plan.md) - 初始实现计划 ## 历史快照文档(只可参考,不可直接当当前真相) -12. [2026-05-18-PRODUCTION_READINESS_REVIEW.md](./2026-05-18-PRODUCTION_READINESS_REVIEW.md) +16. [2026-05-18-PRODUCTION_READINESS_REVIEW.md](./2026-05-18-PRODUCTION_READINESS_REVIEW.md) - 历史审查快照 - 用来看当时发现了哪些系统性问题 -13. [2026-05-18-PRODUCTION_REMEDIATION_TASK_BOARD.md](./2026-05-18-PRODUCTION_REMEDIATION_TASK_BOARD.md) +17. [2026-05-18-PRODUCTION_REMEDIATION_TASK_BOARD.md](./2026-05-18-PRODUCTION_REMEDIATION_TASK_BOARD.md) - 历史整改任务板 - 用来看 2026-05-18 那一轮是如何收口的 diff --git a/docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md b/docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md index c0ee2b07..d5632f68 100644 --- a/docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md +++ b/docs/REAL_HOST_ACCEPTANCE_RUNBOOK.md @@ -16,6 +16,9 @@ - 适合快速确认红线、三层证据和最短诊断顺序。 5. `docs/REAL_HOST_ACCEPTANCE_LEARNINGS.md` - 看已经调通的细节、典型误判点、推荐诊断顺序。 +6. `docs/OPENCLAW_EXTERNAL_VALIDATION.md` + - 当真实宿主、公网域名与最终用户 key 已经打通后,继续看这份。 + - 它定义的是 OpenClaw 最后一跳真实使用验证与升级后自检,不再局限于 relay-manager/host 导入层。 ## 目标 @@ -49,7 +52,7 @@ ```bash cd /path/to/sub2api-cn-relay-manager -bash ./scripts/test_real_host_scripts.sh +bash ./scripts/test/test_real_host_scripts.sh ``` 说明: @@ -60,7 +63,7 @@ bash ./scripts/test_real_host_scripts.sh ```bash cd /path/to/sub2api-cn-relay-manager -scripts/build_local_image.sh +scripts/deploy/build_local_image.sh ``` 默认输出: @@ -76,7 +79,7 @@ cd /path/to/sub2api-cn-relay-manager HOST_BINARY=/path/to/sub2api-patched \ CRM_BINARY=./server \ -bash ./scripts/setup_remote43_patched_stack.sh +bash ./scripts/deploy/setup_remote43_patched_stack.sh ``` 脚本会: @@ -98,7 +101,7 @@ bash /tmp/remote43-patched-stack-18139.tunnel.sh 然后再跑: ```bash -bash ./scripts/import_remote43_provider.sh kimi-a7m kimi-k2.6 A7M_KIMI_API_KEY /path/to/keyfile +bash ./scripts/acceptance/import_remote43_provider.sh kimi-a7m kimi-k2.6 A7M_KIMI_API_KEY /path/to/keyfile ``` ### 3. 先 dry-run 检查真实验收参数 @@ -115,7 +118,7 @@ KEYS=sk-live-1,sk-live-2 \ ACCESS_MODE=self_service \ ACCESS_API_KEY=user-gateway-key \ DRY_RUN=1 \ -bash ./scripts/real_host_acceptance.sh +bash ./scripts/acceptance/real_host_acceptance.sh ``` ### 4. 执行真实验收 @@ -131,7 +134,7 @@ PROVIDER_ID=deepseek \ KEYS=sk-live-1,sk-live-2 \ ACCESS_MODE=self_service \ ACCESS_API_KEY=user-gateway-key \ -bash ./scripts/real_host_acceptance.sh +bash ./scripts/acceptance/real_host_acceptance.sh ``` ### 5. 订阅模式示例 @@ -148,7 +151,7 @@ KEYS=sk-live-1 \ ACCESS_MODE=subscription \ SUBSCRIPTION_USERS=user-a,user-b \ SUBSCRIPTION_DAYS=30 \ -bash ./scripts/real_host_acceptance.sh +bash ./scripts/acceptance/real_host_acceptance.sh ``` ### 6. 导入后自动补 access 前置(可选) @@ -158,7 +161,7 @@ bash ./scripts/real_host_acceptance.sh ```bash AFTER_IMPORT_HOOK_COMMAND='bash /path/to/host-access-hook.sh' \ ... \ -scripts/real_host_acceptance.sh +scripts/acceptance/real_host_acceptance.sh ``` hook 执行时会额外导出: @@ -176,6 +179,31 @@ hook 执行时会额外导出: - `05b-after-import-hook.stdout.txt` - `05b-after-import-hook.stderr.txt` +### 7. OpenClaw 最后一跳外部验证 + +当你已经确认: + +- remote43 或本地 patched host 验收通过 +- 公网根地址已暴露 +- 真实用户可以自助注册并创建 key + +不要在 `21-summary.json` 停止,继续追加一轮 OpenClaw 外部真实验证: + +```bash +~/.openclaw/bin/apply-openclaw-minimax-proxy-fix.sh doctor +~/.openclaw/bin/openclaw-minimax-post-upgrade-check.sh + +openclaw infer model run --local --model "tksea-gpt/gpt-5.4" --prompt "reply with pong only" --json +openclaw infer model run --local --model "tksea-gpt/gpt-5.4-mini" --prompt "reply with pong only" --json +openclaw infer model run --local --model "tksea-minimax/MiniMax-M2.5-highspeed" --prompt "reply with pong only" --json +openclaw infer model run --local --model "tksea-minimax/MiniMax-M2.7-highspeed" --prompt "reply with pong only" --json +``` + +当前推荐把这一步的口径记录到: + +- `docs/OPENCLAW_EXTERNAL_VALIDATION.md` +- 或对应批次 artifact 的补充说明中 + ## 产物 脚本会把每一步 JSON 响应落到: @@ -229,7 +257,7 @@ remote43 / 本地缩圈脚本若需要额外证据,会在同目录追加: - `21-summary.json` / `99-semantic-summary.json`(推荐长期保留的摘要证据) - 若你是在清理旧目录,而不是生成新验收产物,优先运行: ```bash - python3 scripts/migrate_historical_artifacts.py artifacts/real-host-acceptance + python3 scripts/acceptance/migrate_historical_artifacts.py artifacts/real-host-acceptance ``` 它会把主目录中的历史敏感材料迁到 `artifacts/real-host-acceptance-sensitive/`,并在原目录生成安全摘要版。 - 历史目录迁移脚本当前已覆盖两层: @@ -281,7 +309,7 @@ remote43 / 本地缩圈脚本若需要额外证据,会在同目录追加: 1. 默认会执行 rollback smoke;若当前环境不允许回滚,设置: ```bash -SKIP_ROLLBACK=1 scripts/real_host_acceptance.sh +SKIP_ROLLBACK=1 scripts/acceptance/real_host_acceptance.sh ``` 2. `PACK_PATH` 必须是控制面进程可读路径,不是用户本地概念路径。 @@ -292,13 +320,13 @@ SKIP_ROLLBACK=1 scripts/real_host_acceptance.sh 7. `self_service` 验证除普通用户 key 外,还需要该 key 绑定目标 group;若目标 group 是标准计费组,还需要用户侧具备可用余额,否则 `/v1/models` 可能从“未授权”转为 `INSUFFICIENT_BALANCE`。 8. `subscription` 验证需要目标 group 本身是 `subscription` 类型,并且完成“普通用户订阅分配 + 普通用户 key 绑定该 group”;仅有管理员主体或未绑定 key 不足以通过 `/v1/models`。 9. 若需要验证 `reconcile` 收敛,优先在干净宿主场景或隔离 group 下执行,避免历史残留资源把结果污染成 `status=drifted` / `extra_count>0`。 -10. `scripts/import_remote43_provider.sh` 现已内置 remote43 的 subscription 验收补全动作:会根据 import batch 自动解析目标 group,执行“普通用户最低余额补齐 + key/group 绑定 + user_subscriptions upsert + 定向 Redis 缓存失效(auth / balance / subscription)”,并把 SQL / host state 证据写入 artifact 目录。 +10. `scripts/acceptance/import_remote43_provider.sh` 现已内置 remote43 的 subscription 验收补全动作:会根据 import batch 自动解析目标 group,执行“普通用户最低余额补齐 + key/group 绑定 + user_subscriptions upsert + 定向 Redis 缓存失效(auth / balance / subscription)”,并把 SQL / host state 证据写入 artifact 目录。 11. 当 CRM 进程与 operator 到 host 的访问地址不一致时,优先显式设置 `CRM_HOST_BASE`,避免把 CRM 侧探测地址和本地运维隧道地址混用。 12. 对 `Upstream service temporarily unavailable` 一类 502,不要先认定是上游聊天链路故障;先看脚本落盘的 `09-models.headers.txt` / `10-models.body.json`。若 `/v1/models` 已返回了别的 provider 模型集(例如 GPT 系列而不是预期的 DeepSeek/Minimax 模型),先检查普通用户 key/group 绑定,也要检查 CRM 导入时是否把 provider 的 `channel_template.model_mapping`、`restrict_models`、`billing_model_source` 一并下发到宿主 channel。 13. subscription 场景里,closure 最终用于 gateway probe 的 key 是宿主侧 managed key,不一定是请求体里外部传入的 `ACCESS_API_KEY`。如果你拿原始 key 直打 `/v1/models` 收到 `403 not assigned to any group`,先不要判定 CRM 主链路失败。 14. 对“既有 channel 没自动补 `model_pricing`”这类 live 现象,先核对在线 CRM 进程的启动时间与 git 提交时间;之前 MiniMax 的该现象最终被确认是 stale CRM 进程导致,而不是源码缺逻辑。 15. 当 CRM 切换到本机运行时,`PACK_PATH` 也必须切换到控制面本机可读路径;继续沿用远端 `/home/ubuntu/...` 会触发 `stat pack path ... no such file or directory`,这是验收 harness 参数问题,不是导入业务逻辑问题。 -16. 若要把 DeepSeek 的“host `/v1/models`=200 但 host `/v1/chat/completions`=502,而 upstream 直探 `/chat/completions`=200”做成可提 issue 的最小复现,直接运行 `scripts/check_deepseek_completion_split.sh`。它会同时落盘 host `/v1/models`、host `/v1/chat/completions`、upstream `/chat/completions` 三层证据,并在 `summary.json` 里给出 `host_compatibility_gap|upstream_key_quota_issue|unknown` 分类。 +16. 若要把 DeepSeek 的“host `/v1/models`=200 但 host `/v1/chat/completions`=502,而 upstream 直探 `/chat/completions`=200”做成可提 issue 的最小复现,直接运行 `scripts/acceptance/check_deepseek_completion_split.sh`。它会同时落盘 host `/v1/models`、host `/v1/chat/completions`、upstream `/chat/completions` 三层证据,并在 `summary.json` 里给出 `host_compatibility_gap|upstream_key_quota_issue|unknown` 分类。 17. 若 reconcile 面对的是“非 latest batch 的同前缀旧账号”,最新代码会把它们记为 `stale_noise_count` / `stale_noise_accounts` 并保留 `raw_extra_count`,而不是继续把它们算进 `extra_count` 造成 drift 误报;因此应优先看 `extra_count` 是否归零,再看 `probe_failures`/`access_status` 是否仍有真实异常。 18. self_service 场景里,普通用户 gateway key 访问宿主 `/v1/models` / `/v1/chat/completions` 时,真实语义是 `Authorization: Bearer `;若 CRM 的 self_service closure 仍显示 `401/403 broken`,优先排查 gateway probe 是否错误复用了 `x-api-key`。 19. fresh-host 管理员 bearer token 过期时,最前面的 `POST /api/hosts` / `probe-host` 可能直接表现成 CRM 侧 `502`。遇到这类现象,先刷新 host bearer token,再继续验收,不要先把它归因为最新代码故障。 diff --git a/docs/REAL_HOST_ARTIFACT_RETENTION.md b/docs/REAL_HOST_ARTIFACT_RETENTION.md index b354f1c8..de8ee0c6 100644 --- a/docs/REAL_HOST_ARTIFACT_RETENTION.md +++ b/docs/REAL_HOST_ARTIFACT_RETENTION.md @@ -44,7 +44,7 @@ 当历史 `artifacts/real-host-acceptance/` 目录里仍残留旧版敏感材料时,使用: ```bash -python3 scripts/migrate_historical_artifacts.py artifacts/real-host-acceptance +python3 scripts/acceptance/migrate_historical_artifacts.py artifacts/real-host-acceptance ``` 默认行为: diff --git a/docs/SOURCE_OF_TRUTH.md b/docs/SOURCE_OF_TRUTH.md index 9685a27a..93ed8f74 100644 --- a/docs/SOURCE_OF_TRUTH.md +++ b/docs/SOURCE_OF_TRUTH.md @@ -9,7 +9,7 @@ 当前 gate 升到 `APPROVED` 的原因是: 1. 代码侧已关闭“只靠 `/v1/models` 就把 access 标成 ready”的假阳性;当前 ready 必须同时通过 `/v1/models` 与 `/v1/chat/completions` smoke -2. `scripts/import_remote43_provider.sh` 已补上 upstream `/models` 与 `/chat/completions` 直探,并落盘 `21-summary.json` 做根因分类 +2. `scripts/acceptance/import_remote43_provider.sh` 已补上 upstream `/models` 与 `/chat/completions` 直探,并落盘 `21-summary.json` 做根因分类 3. account `credentials.model_mapping`、channel `model_mapping/model_pricing`、managed key 视角 `/v1/models` 都已有 live 证据 4. completion-gated 补丁已经在 fresh-host 上重跑验证通过:control plane 会把 completion 失败正确落成 `broken` 5. MiniMax account probe 假失败也已被最新补丁关闭: diff --git a/packs/openai-cn-pack/providers/minimax-53hk.json b/packs/openai-cn-pack/providers/minimax-53hk.json new file mode 100644 index 00000000..e51313f2 --- /dev/null +++ b/packs/openai-cn-pack/providers/minimax-53hk.json @@ -0,0 +1,31 @@ +{ + "provider_id": "minimax-53hk", + "display_name": "MiniMax 53hk 中转兼容", + "base_url": "https://api.53hk.cn/v1", + "platform": "openai", + "account_type": "apikey", + "default_models": ["MiniMax-M2.7-highspeed", "MiniMax-M2.5-highspeed"], + "smoke_test_model": "MiniMax-M2.7-highspeed", + "group_template": { + "name": "MiniMax 53hk 默认分组", + "rate_multiplier": 1.0 + }, + "channel_template": { + "name": "MiniMax 53hk 默认渠道", + "model_mapping": { + "MiniMax-M2.7-highspeed": "MiniMax-M2.7-highspeed", + "MiniMax-M2.5-highspeed": "MiniMax-M2.5-highspeed" + } + }, + "plan_template": { + "name": "MiniMax 53hk 默认套餐", + "price": 19.9, + "validity_days": 30, + "validity_unit": "day" + }, + "import": { + "supports_multi_key": true, + "supports_strict": true, + "supports_partial": true + } +} diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 00000000..a7ae7264 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,40 @@ +# scripts 目录说明 + +日期:2026-05-27 + +`scripts/` 当前按职责拆成三层,避免部署、验收和回归入口继续平铺混杂。 + +## 目录划分 + +- `scripts/deploy/` + - 部署、构建、远端环境拉起 + - 例如: + - `build_local_image.sh` + - `deploy_tksea_portal.sh` + - `setup_remote43_patched_stack.sh` +- `scripts/acceptance/` + - 真实宿主验收、upstream 直探、artifact 安全化 + - 例如: + - `real_host_acceptance.sh` + - `import_remote43_provider.sh` + - `check_deepseek_completion_split.sh` +- `scripts/test/` + - 脚本自身的回归与资产检查 + - 例如: + - `test_real_host_scripts.sh` + - `test_tksea_portal_assets.sh` + +## 放置规则 + +- 新增脚本前先判断它属于 `deploy`、`acceptance` 还是 `test` +- 需要被目标机直接消费的静态文件不要放这里,应放到 `deploy/` +- 真实验收产物不要放这里,应落到 `artifacts/` + +## 常用入口 + +```bash +bash ./scripts/test/test_real_host_scripts.sh +bash ./scripts/test/test_tksea_portal_assets.sh +scripts/deploy/build_local_image.sh +bash ./scripts/acceptance/real_host_acceptance.sh +``` diff --git a/scripts/artifact_redaction.py b/scripts/acceptance/artifact_redaction.py similarity index 99% rename from scripts/artifact_redaction.py rename to scripts/acceptance/artifact_redaction.py index df4b5afc..271c0d5a 100644 --- a/scripts/artifact_redaction.py +++ b/scripts/acceptance/artifact_redaction.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +"""Helpers for redacting real-host acceptance artifacts.""" import hashlib import json import pathlib diff --git a/scripts/check_deepseek_completion_split.sh b/scripts/acceptance/check_deepseek_completion_split.sh similarity index 98% rename from scripts/check_deepseek_completion_split.sh rename to scripts/acceptance/check_deepseek_completion_split.sh index d2d8bb1f..419f155c 100755 --- a/scripts/check_deepseek_completion_split.sh +++ b/scripts/acceptance/check_deepseek_completion_split.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set -euo pipefail +# 环境变量驱动,便于被不同验收 harness 复用。 + require_var() { local name="$1" if [[ -z "${!name:-}" ]]; then diff --git a/scripts/host_access_prep_lib.sh b/scripts/acceptance/host_access_prep_lib.sh old mode 100644 new mode 100755 similarity index 96% rename from scripts/host_access_prep_lib.sh rename to scripts/acceptance/host_access_prep_lib.sh index e0338a2d..1a3f24f0 --- a/scripts/host_access_prep_lib.sh +++ b/scripts/acceptance/host_access_prep_lib.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set -euo pipefail +# SQL 和缓存 key 组装 helper,供 remote acceptance 脚本复用。 + sql_escape_literal() { local value="$1" local squote="'" diff --git a/scripts/import_remote43_provider.sh b/scripts/acceptance/import_remote43_provider.sh similarity index 97% rename from scripts/import_remote43_provider.sh rename to scripts/acceptance/import_remote43_provider.sh index 58f23a71..32f43cca 100755 --- a/scripts/import_remote43_provider.sh +++ b/scripts/acceptance/import_remote43_provider.sh @@ -6,10 +6,10 @@ model_name="${2:?model_name required}" env_var="${3:?env var required}" key_file="${4:-}" -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" # shellcheck disable=SC1091 -source "$ROOT_DIR/scripts/host_access_prep_lib.sh" -ARTIFACT_REDACTION_SCRIPT="$ROOT_DIR/scripts/artifact_redaction.py" +source "$ROOT_DIR/scripts/acceptance/host_access_prep_lib.sh" +ARTIFACT_REDACTION_SCRIPT="$ROOT_DIR/scripts/acceptance/artifact_redaction.py" KEY="${KEY:-/home/long/下载/zjsea.pem}" REMOTE="${REMOTE:-ubuntu@43.155.133.187}" @@ -33,12 +33,12 @@ mkdir -p "$ART" artifact_redact_key_json() { local value="$1" - python3 "$ROOT_DIR/scripts/artifact_redaction.py" redact-key "$value" + python3 "$ROOT_DIR/scripts/acceptance/artifact_redaction.py" redact-key "$value" } artifact_redact_id() { local value="$1" - python3 "$ROOT_DIR/scripts/artifact_redaction.py" redact-id "$value" + python3 "$ROOT_DIR/scripts/acceptance/artifact_redaction.py" redact-id "$value" } write_json_file() { @@ -49,20 +49,20 @@ write_json_file() { sanitize_headers_file() { local path="$1" - python3 "$ROOT_DIR/scripts/artifact_redaction.py" sanitize-headers "$path" "$path" + python3 "$ROOT_DIR/scripts/acceptance/artifact_redaction.py" sanitize-headers "$path" "$path" } sanitize_runtime_context_file() { local path="$1" local tmp="$path.tmp" - python3 "$ROOT_DIR/scripts/artifact_redaction.py" sanitize-runtime-context "$path" "$tmp" + python3 "$ROOT_DIR/scripts/acceptance/artifact_redaction.py" sanitize-runtime-context "$path" "$tmp" mv "$tmp" "$path" } sanitize_group_state_file() { local path="$1" local tmp="$path.tmp" - python3 "$ROOT_DIR/scripts/artifact_redaction.py" sanitize-group-state "$path" "$tmp" + python3 "$ROOT_DIR/scripts/acceptance/artifact_redaction.py" sanitize-group-state "$path" "$tmp" mv "$tmp" "$path" } diff --git a/scripts/migrate_historical_artifacts.py b/scripts/acceptance/migrate_historical_artifacts.py similarity index 99% rename from scripts/migrate_historical_artifacts.py rename to scripts/acceptance/migrate_historical_artifacts.py index f29b922e..f1dbbc9e 100644 --- a/scripts/migrate_historical_artifacts.py +++ b/scripts/acceptance/migrate_historical_artifacts.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +"""Normalize historical real-host artifacts into repo-safe form.""" import json import pathlib import shutil diff --git a/scripts/real_host_acceptance.sh b/scripts/acceptance/real_host_acceptance.sh similarity index 98% rename from scripts/real_host_acceptance.sh rename to scripts/acceptance/real_host_acceptance.sh index 15c75f14..f8de7edb 100755 --- a/scripts/real_host_acceptance.sh +++ b/scripts/acceptance/real_host_acceptance.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" TIMESTAMP="$(date +%Y%m%d_%H%M%S)" ARTIFACT_DIR="${ARTIFACT_DIR:-$ROOT_DIR/artifacts/real-host-acceptance/$TIMESTAMP}" DRY_RUN="${DRY_RUN:-0}" @@ -47,7 +47,7 @@ save_json() { artifact_redact_key_json() { local value="$1" - python3 "$ROOT_DIR/scripts/artifact_redaction.py" redact-key "$value" + python3 "$ROOT_DIR/scripts/acceptance/artifact_redaction.py" redact-key "$value" } write_checklist_guide() { diff --git a/scripts/build_local_image.sh b/scripts/deploy/build_local_image.sh similarity index 89% rename from scripts/build_local_image.sh rename to scripts/deploy/build_local_image.sh index 56cbf99f..2004d31f 100755 --- a/scripts/build_local_image.sh +++ b/scripts/deploy/build_local_image.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" IMAGE_TAG="${IMAGE_TAG:-sub2api-cn-relay-manager:local}" BINARY_PATH="${BINARY_PATH:-$ROOT_DIR/bin/sub2api-cn-relay-manager}" diff --git a/scripts/deploy/deploy_tksea_portal.sh b/scripts/deploy/deploy_tksea_portal.sh new file mode 100755 index 00000000..0c7b9257 --- /dev/null +++ b/scripts/deploy/deploy_tksea_portal.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +KEY="${KEY:-/home/long/下载/zjsea.pem}" +REMOTE="${REMOTE:-ubuntu@43.155.133.187}" +REMOTE_PORTAL_DIR="${REMOTE_PORTAL_DIR:-/var/www/sub2api-portal}" +REMOTE_NGINX_SITE="${REMOTE_NGINX_SITE:-/etc/nginx/sites-available/tksea}" +REMOTE_HOST_PORT="${REMOTE_HOST_PORT:-18169}" +LOCAL_PORTAL_INDEX="${LOCAL_PORTAL_INDEX:-$ROOT_DIR/deploy/tksea-portal/index.html}" +REMOTE_STAGE_DIR="${REMOTE_STAGE_DIR:-/tmp/sub2api-portal-deploy}" +DRY_RUN="${DRY_RUN:-0}" + +die() { + echo "$*" >&2 + exit 1 +} + +require_cmd() { + command -v "$1" >/dev/null 2>&1 || die "missing command: $1" +} + +run_cmd() { + if [[ "$DRY_RUN" == "1" ]]; then + printf 'DRY_RUN:' + printf ' %q' "$@" + printf '\n' + return 0 + fi + "$@" +} + +ssh_remote() { + run_cmd ssh -i "$KEY" -o StrictHostKeyChecking=no "$REMOTE" "$@" +} + +scp_remote() { + run_cmd scp -i "$KEY" -o StrictHostKeyChecking=no "$@" +} + +main() { + require_cmd python3 + require_cmd ssh + require_cmd scp + + [[ -f "$LOCAL_PORTAL_INDEX" ]] || die "missing portal index: $LOCAL_PORTAL_INDEX" + if [[ "$DRY_RUN" != "1" ]]; then + [[ -f "$KEY" ]] || die "missing ssh key: $KEY" + fi + + local tmpdir patch_file index_copy + tmpdir="$(mktemp -d)" + trap "rm -rf $(printf '%q' "$tmpdir")" EXIT + patch_file="$tmpdir/patch_tksea_portal_nginx.py" + index_copy="$tmpdir/index.html" + + cp "$LOCAL_PORTAL_INDEX" "$index_copy" + + cat > "$patch_file" <&2 @@ -26,7 +26,7 @@ assert_not_contains() { run_test_build_subscription_access_prep_sql() { # shellcheck disable=SC1091 - source "$ROOT_DIR/scripts/host_access_prep_lib.sh" + source "$ROOT_DIR/scripts/acceptance/host_access_prep_lib.sh" local sql sql="$(build_subscription_access_prep_sql 42 'sk-test-123' 7 10 30 1 'hermes remote subscription validation')" @@ -141,7 +141,7 @@ EOF SUBSCRIPTION_USERS="42" \ SKIP_ROLLBACK="1" \ AFTER_IMPORT_HOOK_COMMAND='printf "%s\n" "$BATCH_ID:$BATCH_DETAIL_FILE:$ACCESS_MODE" > "$ARTIFACT_DIR/hook.txt"' \ - "$ROOT_DIR/scripts/real_host_acceptance.sh" >"$stdout_file" + "$ROOT_DIR/scripts/acceptance/real_host_acceptance.sh" >"$stdout_file" [[ -f "$hook_file" ]] || fail "after-import hook did not create $hook_file" [[ -f "$guide_file" ]] || fail "artifact guide was not created" @@ -244,7 +244,7 @@ EOF UPSTREAM_BASE="https://upstream.example.com/v1" \ UPSTREAM_API_KEY="upstream-key" \ MODEL="deepseek-v4-flash" \ - bash "$ROOT_DIR/scripts/check_deepseek_completion_split.sh" >"$stdout_file" + bash "$ROOT_DIR/scripts/acceptance/check_deepseek_completion_split.sh" >"$stdout_file" [[ -f "$summary_file" ]] || fail "missing summary file: $summary_file" local summary stdout_contents host_headers upstream_headers @@ -501,7 +501,7 @@ EOF SUBSCRIPTION_DAYS=30 \ MIN_BALANCE=10 \ SKIP_ROLLBACK=1 \ - bash "$ROOT_DIR/scripts/import_remote43_provider.sh" deepseek gpt-4 UPSTREAM_KEY >/dev/null + bash "$ROOT_DIR/scripts/acceptance/import_remote43_provider.sh" deepseek gpt-4 UPSTREAM_KEY >/dev/null [[ -f "$summary_file" ]] || fail "prep summary was not captured" local prep_summary @@ -618,7 +618,7 @@ EOF {"access_closures":[{"DetailsJSON":"{\"requested_probe_api_key\":\"sk-raw-probe-20260523b\",\"subscription_users\":[\"crm-user\"]}"}]} EOF - python3 "$ROOT_DIR/scripts/migrate_historical_artifacts.py" "$src_root" >/dev/null + python3 "$ROOT_DIR/scripts/acceptance/migrate_historical_artifacts.py" "$src_root" >/dev/null local migrated_runtime migrated_key_source migrated_invalidation migrated_group_state headers_text summary_json semantic_json details_json migrated_runtime="$(cat "$target_dir/01-runtime-context.json")" @@ -654,7 +654,7 @@ EOF run_test_remote43_patched_stack_renderers() { # shellcheck disable=SC1091 - source "$ROOT_DIR/scripts/remote43_patched_stack_lib.sh" + source "$ROOT_DIR/scripts/deploy/remote43_patched_stack_lib.sh" local host_env crm_env bootstrap host_env="$(render_remote43_host_env "stack-pg" "stack-redis" "db-pass" "sub2api" "admin@sub2api.local" "admin-pass" "jwt-secret" "totp-secret")" @@ -733,7 +733,7 @@ run_test_setup_remote43_patched_stack_dry_run() { LOCAL_TUNNEL_SCRIPT="$tunnel_script" \ REMOTE_ROOT="/home/ubuntu/test-stack" \ DRY_RUN=1 \ - bash "$ROOT_DIR/scripts/setup_remote43_patched_stack.sh" >"$stdout_file" + bash "$ROOT_DIR/scripts/deploy/setup_remote43_patched_stack.sh" >"$stdout_file" [[ -f "$operator_env" ]] || fail "operator env file was not created" [[ -f "$tunnel_script" ]] || fail "tunnel script was not created" diff --git a/scripts/test/test_tksea_portal_assets.sh b/scripts/test/test_tksea_portal_assets.sh new file mode 100755 index 00000000..99c0bb9d --- /dev/null +++ b/scripts/test/test_tksea_portal_assets.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +HTML_FILE="$ROOT_DIR/deploy/tksea-portal/index.html" +NGINX_FILE="$ROOT_DIR/deploy/tksea-portal/nginx.sub.tksea.top.conf.example" +DEPLOY_SCRIPT="$ROOT_DIR/scripts/deploy/deploy_tksea_portal.sh" + +fail() { + echo "FAIL: $*" >&2 + exit 1 +} + +assert_contains_file() { + local file="$1" + local needle="$2" + if ! grep -Fq "$needle" "$file"; then + fail "expected [$needle] in $file" + fi +} + +[[ -f "$HTML_FILE" ]] || fail "missing $HTML_FILE" +[[ -f "$NGINX_FILE" ]] || fail "missing $NGINX_FILE" +[[ -f "$DEPLOY_SCRIPT" ]] || fail "missing $DEPLOY_SCRIPT" + +assert_contains_file "$HTML_FILE" "Sub2API 多模型接入中心" +assert_contains_file "$HTML_FILE" "https://sub.tksea.top/portal/" +assert_contains_file "$HTML_FILE" "/portal-proxy/api/v1" +assert_contains_file "$HTML_FILE" "localStorage.setItem" +assert_contains_file "$HTML_FILE" "/auth/me" +assert_contains_file "$HTML_FILE" "/groups/available" +assert_contains_file "$HTML_FILE" "/subscriptions" +assert_contains_file "$HTML_FILE" "/keys?page=1&page_size=20" +assert_contains_file "$HTML_FILE" "copy-existing-key-btn" +assert_contains_file "$HTML_FILE" "已有 Key" +assert_contains_file "$HTML_FILE" "showToast" +assert_contains_file "$HTML_FILE" "可立即使用" +assert_contains_file "$HTML_FILE" "需开通" +assert_contains_file "$HTML_FILE" "暂不推荐" +assert_contains_file "$HTML_FILE" "gpt-5.4" +assert_contains_file "$HTML_FILE" "MiniMax-M2.7-highspeed" +assert_contains_file "$HTML_FILE" "deepseek-chat" + +assert_contains_file "$NGINX_FILE" "location = /portal" +assert_contains_file "$NGINX_FILE" "location = /kimi-portal" +assert_contains_file "$NGINX_FILE" "location /portal/" +assert_contains_file "$NGINX_FILE" "location /portal-proxy/" +assert_contains_file "$NGINX_FILE" "location /kimi-portal-proxy/" + +assert_contains_file "$DEPLOY_SCRIPT" "portal url: https://sub.tksea.top/portal/" +assert_contains_file "$DEPLOY_SCRIPT" "REMOTE_PORTAL_DIR" +assert_contains_file "$DEPLOY_SCRIPT" "patch_tksea_portal_nginx.py" + +echo "PASS: tksea portal assets look consistent"