{"owner":"Wei-Shaw","repo":"sub2api","hasSkills":true,"totalSkillsCount":3,"totalTokensCount":3644,"categories":["anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":["skills/sub2api-admin/references/admin-cli.md","skills/sub2api-admin/SKILL.md","skills/sub2api-admin/agents/openai.yaml"],"skills":{"skills/sub2api-admin/references/admin-cli.md":"# Sub2API Admin Reference\n\n## Environment\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# 或者，未配置管理员 API Key 时使用管理员 JWT：\n# export SUB2API_JWT='<admin access_token>'\n```\n\n后台鉴权优先使用 `SUB2API_ADMIN_API_KEY` 发送 `x-api-key`，未设置时使用 `SUB2API_JWT` 发送 `Authorization: Bearer <jwt>`。如果返回 `INVALID_ADMIN_KEY`，重新生成管理员 API Key；如果使用 JWT，先用管理员邮箱密码登录并从响应的 `data.access_token` 复制 token：\n\n```bash\ncurl -sS \"$SUB2API_BASE_URL/api/v1/auth/login\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"email\":\"admin@example.com\",\"password\":\"your-password\"}'\n```\n\n## CLI\n\n以下命令都假设当前目录是这个 skill 目录。\n\n```bash\nnode scripts/sub2api-admin.js <command>\n```\n\n## Accounts\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts list --search outlook --platform openai --type oauth --status active\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts stats 40 --days 30\nnode scripts/sub2api-admin.js accounts today-stats 40\nnode scripts/sub2api-admin.js accounts batch-today-stats --ids 40,39\nnode scripts/sub2api-admin.js accounts models 40\nnode scripts/sub2api-admin.js accounts temp-unschedulable 40\nnode scripts/sub2api-admin.js accounts antigravity-default-model-mapping\n```\n\n`accounts export` 会包含账号凭据和 token，建议写入文件，不要直接刷屏：\n\n```bash\nnode scripts/sub2api-admin.js accounts export --ids 40,39 --file accounts-export.json\nnode scripts/sub2api-admin.js accounts export --platform openai --type oauth --include-proxies false --file accounts-export.json\n```\n\n### 单账号写入\n\n```bash\nnode scripts/sub2api-admin.js accounts create --file account.json\nnode scripts/sub2api-admin.js accounts update 40 --json '{\"concurrency\":20}'\nnode scripts/sub2api-admin.js accounts set-status 40 active\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts clear-error 40\nnode scripts/sub2api-admin.js accounts clear-rate-limit 40\nnode scripts/sub2api-admin.js accounts recover-state 40\nnode scripts/sub2api-admin.js accounts reset-quota 40\nnode scripts/sub2api-admin.js accounts refresh 40\nnode scripts/sub2api-admin.js accounts test 40\nnode scripts/sub2api-admin.js accounts sync-models 40\nnode scripts/sub2api-admin.js accounts apply-oauth 40 --file credentials.json\nnode scripts/sub2api-admin.js accounts reset-temp-unschedulable 40\n```\n\n### 删除与清理\n\n删除前先列出目标账号名和 ID。\n\n```bash\nnode scripts/sub2api-admin.js accounts delete 25\nnode scripts/sub2api-admin.js accounts keep-only --name 'target@example.com'\n```\n\n### 批量写入\n\n```bash\nnode scripts/sub2api-admin.js accounts batch-create --file accounts.json\nnode scripts/sub2api-admin.js accounts batch-update-credentials --file payload.json\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10,\"priority\":2}'\nnode scripts/sub2api-admin.js accounts batch-refresh --ids 40,39\nnode scripts/sub2api-admin.js accounts batch-clear-error --ids 40,39\n```\n\n`bulk-update` 可覆盖页面“批量更新”的字段，payload 由后台表单字段决定，例如 `base_url`、`model_mapping`、`group_ids`、`proxy_id`、`concurrency`、`priority`、`rate_multiplier`、`status`、`compact_mode` 等。更新前先用 `accounts get <id>` 确认字段名。\n\n### 导入\n\n通用后台导入：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-data --file accounts-export.json\nnode scripts/sub2api-admin.js accounts import-codex-session --file payload.json\n```\n\nCRS 同步：\n\n```bash\nnode scripts/sub2api-admin.js accounts crs-preview --file payload.json\nnode scripts/sub2api-admin.js accounts crs-sync --file payload.json\n```\n\n旧版 JSON 导入仍可用，会把模板账号的配置复制给导入账号：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-json \\\n  --file /path/accounts.json \\\n  --template-name 'template@example.com' \\\n  --dry-run\n```\n\n复制字段：\n\n- `concurrency`\n- `priority`\n- `group_ids`\n- `credentials.model_mapping`\n\n## Groups And Proxies\n\n```bash\nnode scripts/sub2api-admin.js groups all\nnode scripts/sub2api-admin.js proxies all\n```\n\n## Redeem Codes\n\n兑换码类型包括 `balance`、`concurrency`、`subscription`、`invitation`。状态常用 `unused`、`used`、`expired`。\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes list --type balance --status unused --search user@example.com\nnode scripts/sub2api-admin.js redeem-codes get 123\nnode scripts/sub2api-admin.js redeem-codes stats\nnode scripts/sub2api-admin.js redeem-codes export --file redeem-codes.csv\n```\n\n### 生成兑换码\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' \\\n  --idempotency-key \"redeem-generate-$(date +%s)\"\n```\n\n订阅兑换码需要 `group_id` 和非零 `validity_days`：\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"subscription\",\"value\":0,\"group_id\":2,\"validity_days\":30}' \\\n  --idempotency-key \"redeem-subscription-$(date +%s)\"\n```\n\n### 创建并兑换\n\n用于支付回调或人工充值，一步完成创建兑换码并兑换到用户。生产流程必须传稳定的 `--idempotency-key`。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem \\\n  --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123,\"notes\":\"manual recharge\"}' \\\n  --idempotency-key order-123\n```\n\n### 修改与清理\n\n写入前先 `list` 或 `get` 核对目标 ID。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes batch-update --ids 123,124 --json '{\"notes\":\"campaign A\"}'\nnode scripts/sub2api-admin.js redeem-codes expire 123\nnode scripts/sub2api-admin.js redeem-codes delete 123\nnode scripts/sub2api-admin.js redeem-codes batch-delete --ids 123,124\n```\n\n## Error Rules And TLS Profiles\n\n对应账号页顶部“错误透传规则”和“TLS 指纹模板”。\n\n```bash\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js error-rules get 1\nnode scripts/sub2api-admin.js error-rules create --file rule.json\nnode scripts/sub2api-admin.js error-rules update 1 --json '{\"enabled\":true}'\nnode scripts/sub2api-admin.js error-rules toggle 1 false\nnode scripts/sub2api-admin.js error-rules delete 1\n\nnode scripts/sub2api-admin.js tls-profiles list\nnode scripts/sub2api-admin.js tls-profiles get 1\nnode scripts/sub2api-admin.js tls-profiles create --file profile.json\nnode scripts/sub2api-admin.js tls-profiles update 1 --file profile.json\nnode scripts/sub2api-admin.js tls-profiles delete 1\n```\n\n## Raw Admin API\n\n未封装或新版本后台接口可用 `api` 直通。路径可写 `/admin/...` 或 `/api/v1/admin/...`。\n\n```bash\nnode scripts/sub2api-admin.js api GET /admin/groups/all\nnode scripts/sub2api-admin.js api POST /admin/accounts/bulk-update \\\n  --json '{\"account_ids\":[40],\"concurrency\":10}'\n```\n\n## Confirmed Admin Endpoints\n\n- `GET /api/v1/admin/accounts`\n- `GET /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts`\n- `PUT /api/v1/admin/accounts/:id`\n- `DELETE /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts/check-mixed-channel`\n- `GET /api/v1/admin/accounts/:id/usage`\n- `GET /api/v1/admin/accounts/:id/stats`\n- `GET /api/v1/admin/accounts/:id/today-stats`\n- `POST /api/v1/admin/accounts/today-stats/batch`\n- `POST /api/v1/admin/accounts/:id/schedulable`\n- `POST /api/v1/admin/accounts/:id/test`\n- `POST /api/v1/admin/accounts/:id/refresh`\n- `POST /api/v1/admin/accounts/:id/apply-oauth-credentials`\n- `POST /api/v1/admin/accounts/:id/clear-error`\n- `POST /api/v1/admin/accounts/:id/clear-rate-limit`\n- `POST /api/v1/admin/accounts/:id/recover-state`\n- `POST /api/v1/admin/accounts/:id/reset-quota`\n- `GET /api/v1/admin/accounts/:id/temp-unschedulable`\n- `DELETE /api/v1/admin/accounts/:id/temp-unschedulable`\n- `GET /api/v1/admin/accounts/:id/models`\n- `POST /api/v1/admin/accounts/:id/models/sync-upstream`\n- `POST /api/v1/admin/accounts/batch`\n- `POST /api/v1/admin/accounts/batch-update-credentials`\n- `POST /api/v1/admin/accounts/bulk-update`\n- `POST /api/v1/admin/accounts/batch-refresh`\n- `POST /api/v1/admin/accounts/batch-clear-error`\n- `GET /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/import/codex-session`\n- `POST /api/v1/admin/accounts/sync/crs/preview`\n- `POST /api/v1/admin/accounts/sync/crs`\n- `GET /api/v1/admin/accounts/antigravity/default-model-mapping`\n- `GET /api/v1/admin/groups/all`\n- `GET /api/v1/admin/proxies/all`\n- `GET /api/v1/admin/redeem-codes`\n- `GET /api/v1/admin/redeem-codes/export`\n- `GET /api/v1/admin/redeem-codes/stats`\n- `GET /api/v1/admin/redeem-codes/:id`\n- `POST /api/v1/admin/redeem-codes/generate`\n- `POST /api/v1/admin/redeem-codes/create-and-redeem`\n- `POST /api/v1/admin/redeem-codes/batch-update`\n- `POST /api/v1/admin/redeem-codes/batch-delete`\n- `POST /api/v1/admin/redeem-codes/:id/expire`\n- `DELETE /api/v1/admin/redeem-codes/:id`\n- `GET /api/v1/admin/error-passthrough-rules`\n- `GET /api/v1/admin/error-passthrough-rules/:id`\n- `POST /api/v1/admin/error-passthrough-rules`\n- `PUT /api/v1/admin/error-passthrough-rules/:id`\n- `DELETE /api/v1/admin/error-passthrough-rules/:id`\n- `GET /api/v1/admin/tls-fingerprint-profiles`\n- `GET /api/v1/admin/tls-fingerprint-profiles/:id`\n- `POST /api/v1/admin/tls-fingerprint-profiles`\n- `PUT /api/v1/admin/tls-fingerprint-profiles/:id`\n- `DELETE /api/v1/admin/tls-fingerprint-profiles/:id`\n\n## Notes\n\n- 线上写入前先只读核对目标集合。\n- 导出结果包含敏感凭据，优先使用 `--file`。\n- `PUT /admin/accounts/:id` 和 `bulk-update` 接受宽松请求体，字段名不确定时先用 `accounts get` 或后台页面确认。\n","skills/sub2api-admin/SKILL.md":"---\nname: sub2api-admin\ndescription: Manage Sub2API admin APIs for accounts, redeem codes, groups, proxies, error passthrough rules, TLS fingerprint profiles, imports, exports, batch updates, and raw administrator API calls. Use when the user mentions Sub2API, admin API keys, account management, redeem code management, recharge codes, invitation codes, bulk account import/export, keeping or deleting accounts, refreshing accounts, clearing errors, CRS sync, or managing Sub2API backend settings through the admin API.\n---\n\n# Sub2API Admin\n\nUse the bundled CLI instead of ad hoc `curl`. Run examples from this skill directory.\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# Or, when the deployment uses admin JWT login instead of an admin API key:\n# export SUB2API_JWT='<admin access_token>'\nnode scripts/sub2api-admin.js accounts list\n```\n\nFor all commands and payload examples, read [references/admin-cli.md](references/admin-cli.md).\n\n## Workflow\n\n1. Reuse `SUB2API_BASE_URL` and either `SUB2API_ADMIN_API_KEY` or `SUB2API_JWT` from the environment.\n2. Run read-only commands first: `accounts list`, `accounts get <id>`, `groups all`, or `proxies all`.\n3. Before destructive or bulk writes, print the target account names and IDs.\n4. Execute the write command only after the target set is clear.\n5. Run a follow-up read command to verify the result.\n\n## Common Commands\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10}'\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes generate --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' --idempotency-key redeem-$(date +%s)\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123}' --idempotency-key order-123\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js tls-profiles list\n```\n\n## Safety Notes\n\n- Authentication uses `x-api-key` from `SUB2API_ADMIN_API_KEY` first, then falls back to `Authorization: Bearer <jwt>` from `SUB2API_JWT`.\n- If the API returns `INVALID_ADMIN_KEY`, ask the user to regenerate the admin API key. If using JWT, log in as an admin user and copy the `access_token` from `POST /api/v1/auth/login`.\n- `accounts export` includes credentials and tokens. Prefer `--file` and avoid printing exports in chat.\n- Redeem code create/redeem commands should use `--idempotency-key` for payment or recharge workflows.\n- For uncertain or newly added backend APIs, use `api <METHOD> <admin-path>` after a read-only check.\n","skills/sub2api-admin/agents/openai.yaml":"interface:\n  display_name: \"Sub2API Admin\"\n  short_description: \"Manage Sub2API admin accounts and settings\"\n  default_prompt: \"Use $sub2api-admin to inspect and manage Sub2API backend accounts safely.\"\n\npolicy:\n  allow_implicit_invocation: true\n"},"files":{"skills/sub2api-admin/references/admin-cli.md":"# Sub2API Admin Reference\n\n## Environment\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# 或者，未配置管理员 API Key 时使用管理员 JWT：\n# export SUB2API_JWT='<admin access_token>'\n```\n\n后台鉴权优先使用 `SUB2API_ADMIN_API_KEY` 发送 `x-api-key`，未设置时使用 `SUB2API_JWT` 发送 `Authorization: Bearer <jwt>`。如果返回 `INVALID_ADMIN_KEY`，重新生成管理员 API Key；如果使用 JWT，先用管理员邮箱密码登录并从响应的 `data.access_token` 复制 token：\n\n```bash\ncurl -sS \"$SUB2API_BASE_URL/api/v1/auth/login\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"email\":\"admin@example.com\",\"password\":\"your-password\"}'\n```\n\n## CLI\n\n以下命令都假设当前目录是这个 skill 目录。\n\n```bash\nnode scripts/sub2api-admin.js <command>\n```\n\n## Accounts\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts list --search outlook --platform openai --type oauth --status active\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts stats 40 --days 30\nnode scripts/sub2api-admin.js accounts today-stats 40\nnode scripts/sub2api-admin.js accounts batch-today-stats --ids 40,39\nnode scripts/sub2api-admin.js accounts models 40\nnode scripts/sub2api-admin.js accounts temp-unschedulable 40\nnode scripts/sub2api-admin.js accounts antigravity-default-model-mapping\n```\n\n`accounts export` 会包含账号凭据和 token，建议写入文件，不要直接刷屏：\n\n```bash\nnode scripts/sub2api-admin.js accounts export --ids 40,39 --file accounts-export.json\nnode scripts/sub2api-admin.js accounts export --platform openai --type oauth --include-proxies false --file accounts-export.json\n```\n\n### 单账号写入\n\n```bash\nnode scripts/sub2api-admin.js accounts create --file account.json\nnode scripts/sub2api-admin.js accounts update 40 --json '{\"concurrency\":20}'\nnode scripts/sub2api-admin.js accounts set-status 40 active\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts clear-error 40\nnode scripts/sub2api-admin.js accounts clear-rate-limit 40\nnode scripts/sub2api-admin.js accounts recover-state 40\nnode scripts/sub2api-admin.js accounts reset-quota 40\nnode scripts/sub2api-admin.js accounts refresh 40\nnode scripts/sub2api-admin.js accounts test 40\nnode scripts/sub2api-admin.js accounts sync-models 40\nnode scripts/sub2api-admin.js accounts apply-oauth 40 --file credentials.json\nnode scripts/sub2api-admin.js accounts reset-temp-unschedulable 40\n```\n\n### 删除与清理\n\n删除前先列出目标账号名和 ID。\n\n```bash\nnode scripts/sub2api-admin.js accounts delete 25\nnode scripts/sub2api-admin.js accounts keep-only --name 'target@example.com'\n```\n\n### 批量写入\n\n```bash\nnode scripts/sub2api-admin.js accounts batch-create --file accounts.json\nnode scripts/sub2api-admin.js accounts batch-update-credentials --file payload.json\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10,\"priority\":2}'\nnode scripts/sub2api-admin.js accounts batch-refresh --ids 40,39\nnode scripts/sub2api-admin.js accounts batch-clear-error --ids 40,39\n```\n\n`bulk-update` 可覆盖页面“批量更新”的字段，payload 由后台表单字段决定，例如 `base_url`、`model_mapping`、`group_ids`、`proxy_id`、`concurrency`、`priority`、`rate_multiplier`、`status`、`compact_mode` 等。更新前先用 `accounts get <id>` 确认字段名。\n\n### 导入\n\n通用后台导入：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-data --file accounts-export.json\nnode scripts/sub2api-admin.js accounts import-codex-session --file payload.json\n```\n\nCRS 同步：\n\n```bash\nnode scripts/sub2api-admin.js accounts crs-preview --file payload.json\nnode scripts/sub2api-admin.js accounts crs-sync --file payload.json\n```\n\n旧版 JSON 导入仍可用，会把模板账号的配置复制给导入账号：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-json \\\n  --file /path/accounts.json \\\n  --template-name 'template@example.com' \\\n  --dry-run\n```\n\n复制字段：\n\n- `concurrency`\n- `priority`\n- `group_ids`\n- `credentials.model_mapping`\n\n## Groups And Proxies\n\n```bash\nnode scripts/sub2api-admin.js groups all\nnode scripts/sub2api-admin.js proxies all\n```\n\n## Redeem Codes\n\n兑换码类型包括 `balance`、`concurrency`、`subscription`、`invitation`。状态常用 `unused`、`used`、`expired`。\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes list --type balance --status unused --search user@example.com\nnode scripts/sub2api-admin.js redeem-codes get 123\nnode scripts/sub2api-admin.js redeem-codes stats\nnode scripts/sub2api-admin.js redeem-codes export --file redeem-codes.csv\n```\n\n### 生成兑换码\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' \\\n  --idempotency-key \"redeem-generate-$(date +%s)\"\n```\n\n订阅兑换码需要 `group_id` 和非零 `validity_days`：\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"subscription\",\"value\":0,\"group_id\":2,\"validity_days\":30}' \\\n  --idempotency-key \"redeem-subscription-$(date +%s)\"\n```\n\n### 创建并兑换\n\n用于支付回调或人工充值，一步完成创建兑换码并兑换到用户。生产流程必须传稳定的 `--idempotency-key`。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem \\\n  --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123,\"notes\":\"manual recharge\"}' \\\n  --idempotency-key order-123\n```\n\n### 修改与清理\n\n写入前先 `list` 或 `get` 核对目标 ID。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes batch-update --ids 123,124 --json '{\"notes\":\"campaign A\"}'\nnode scripts/sub2api-admin.js redeem-codes expire 123\nnode scripts/sub2api-admin.js redeem-codes delete 123\nnode scripts/sub2api-admin.js redeem-codes batch-delete --ids 123,124\n```\n\n## Error Rules And TLS Profiles\n\n对应账号页顶部“错误透传规则”和“TLS 指纹模板”。\n\n```bash\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js error-rules get 1\nnode scripts/sub2api-admin.js error-rules create --file rule.json\nnode scripts/sub2api-admin.js error-rules update 1 --json '{\"enabled\":true}'\nnode scripts/sub2api-admin.js error-rules toggle 1 false\nnode scripts/sub2api-admin.js error-rules delete 1\n\nnode scripts/sub2api-admin.js tls-profiles list\nnode scripts/sub2api-admin.js tls-profiles get 1\nnode scripts/sub2api-admin.js tls-profiles create --file profile.json\nnode scripts/sub2api-admin.js tls-profiles update 1 --file profile.json\nnode scripts/sub2api-admin.js tls-profiles delete 1\n```\n\n## Raw Admin API\n\n未封装或新版本后台接口可用 `api` 直通。路径可写 `/admin/...` 或 `/api/v1/admin/...`。\n\n```bash\nnode scripts/sub2api-admin.js api GET /admin/groups/all\nnode scripts/sub2api-admin.js api POST /admin/accounts/bulk-update \\\n  --json '{\"account_ids\":[40],\"concurrency\":10}'\n```\n\n## Confirmed Admin Endpoints\n\n- `GET /api/v1/admin/accounts`\n- `GET /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts`\n- `PUT /api/v1/admin/accounts/:id`\n- `DELETE /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts/check-mixed-channel`\n- `GET /api/v1/admin/accounts/:id/usage`\n- `GET /api/v1/admin/accounts/:id/stats`\n- `GET /api/v1/admin/accounts/:id/today-stats`\n- `POST /api/v1/admin/accounts/today-stats/batch`\n- `POST /api/v1/admin/accounts/:id/schedulable`\n- `POST /api/v1/admin/accounts/:id/test`\n- `POST /api/v1/admin/accounts/:id/refresh`\n- `POST /api/v1/admin/accounts/:id/apply-oauth-credentials`\n- `POST /api/v1/admin/accounts/:id/clear-error`\n- `POST /api/v1/admin/accounts/:id/clear-rate-limit`\n- `POST /api/v1/admin/accounts/:id/recover-state`\n- `POST /api/v1/admin/accounts/:id/reset-quota`\n- `GET /api/v1/admin/accounts/:id/temp-unschedulable`\n- `DELETE /api/v1/admin/accounts/:id/temp-unschedulable`\n- `GET /api/v1/admin/accounts/:id/models`\n- `POST /api/v1/admin/accounts/:id/models/sync-upstream`\n- `POST /api/v1/admin/accounts/batch`\n- `POST /api/v1/admin/accounts/batch-update-credentials`\n- `POST /api/v1/admin/accounts/bulk-update`\n- `POST /api/v1/admin/accounts/batch-refresh`\n- `POST /api/v1/admin/accounts/batch-clear-error`\n- `GET /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/import/codex-session`\n- `POST /api/v1/admin/accounts/sync/crs/preview`\n- `POST /api/v1/admin/accounts/sync/crs`\n- `GET /api/v1/admin/accounts/antigravity/default-model-mapping`\n- `GET /api/v1/admin/groups/all`\n- `GET /api/v1/admin/proxies/all`\n- `GET /api/v1/admin/redeem-codes`\n- `GET /api/v1/admin/redeem-codes/export`\n- `GET /api/v1/admin/redeem-codes/stats`\n- `GET /api/v1/admin/redeem-codes/:id`\n- `POST /api/v1/admin/redeem-codes/generate`\n- `POST /api/v1/admin/redeem-codes/create-and-redeem`\n- `POST /api/v1/admin/redeem-codes/batch-update`\n- `POST /api/v1/admin/redeem-codes/batch-delete`\n- `POST /api/v1/admin/redeem-codes/:id/expire`\n- `DELETE /api/v1/admin/redeem-codes/:id`\n- `GET /api/v1/admin/error-passthrough-rules`\n- `GET /api/v1/admin/error-passthrough-rules/:id`\n- `POST /api/v1/admin/error-passthrough-rules`\n- `PUT /api/v1/admin/error-passthrough-rules/:id`\n- `DELETE /api/v1/admin/error-passthrough-rules/:id`\n- `GET /api/v1/admin/tls-fingerprint-profiles`\n- `GET /api/v1/admin/tls-fingerprint-profiles/:id`\n- `POST /api/v1/admin/tls-fingerprint-profiles`\n- `PUT /api/v1/admin/tls-fingerprint-profiles/:id`\n- `DELETE /api/v1/admin/tls-fingerprint-profiles/:id`\n\n## Notes\n\n- 线上写入前先只读核对目标集合。\n- 导出结果包含敏感凭据，优先使用 `--file`。\n- `PUT /admin/accounts/:id` 和 `bulk-update` 接受宽松请求体，字段名不确定时先用 `accounts get` 或后台页面确认。\n","skills/sub2api-admin/SKILL.md":"---\nname: sub2api-admin\ndescription: Manage Sub2API admin APIs for accounts, redeem codes, groups, proxies, error passthrough rules, TLS fingerprint profiles, imports, exports, batch updates, and raw administrator API calls. Use when the user mentions Sub2API, admin API keys, account management, redeem code management, recharge codes, invitation codes, bulk account import/export, keeping or deleting accounts, refreshing accounts, clearing errors, CRS sync, or managing Sub2API backend settings through the admin API.\n---\n\n# Sub2API Admin\n\nUse the bundled CLI instead of ad hoc `curl`. Run examples from this skill directory.\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# Or, when the deployment uses admin JWT login instead of an admin API key:\n# export SUB2API_JWT='<admin access_token>'\nnode scripts/sub2api-admin.js accounts list\n```\n\nFor all commands and payload examples, read [references/admin-cli.md](references/admin-cli.md).\n\n## Workflow\n\n1. Reuse `SUB2API_BASE_URL` and either `SUB2API_ADMIN_API_KEY` or `SUB2API_JWT` from the environment.\n2. Run read-only commands first: `accounts list`, `accounts get <id>`, `groups all`, or `proxies all`.\n3. Before destructive or bulk writes, print the target account names and IDs.\n4. Execute the write command only after the target set is clear.\n5. Run a follow-up read command to verify the result.\n\n## Common Commands\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10}'\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes generate --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' --idempotency-key redeem-$(date +%s)\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123}' --idempotency-key order-123\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js tls-profiles list\n```\n\n## Safety Notes\n\n- Authentication uses `x-api-key` from `SUB2API_ADMIN_API_KEY` first, then falls back to `Authorization: Bearer <jwt>` from `SUB2API_JWT`.\n- If the API returns `INVALID_ADMIN_KEY`, ask the user to regenerate the admin API key. If using JWT, log in as an admin user and copy the `access_token` from `POST /api/v1/auth/login`.\n- `accounts export` includes credentials and tokens. Prefer `--file` and avoid printing exports in chat.\n- Redeem code create/redeem commands should use `--idempotency-key` for payment or recharge workflows.\n- For uncertain or newly added backend APIs, use `api <METHOD> <admin-path>` after a read-only check.\n","skills/sub2api-admin/agents/openai.yaml":"interface:\n  display_name: \"Sub2API Admin\"\n  short_description: \"Manage Sub2API admin accounts and settings\"\n  default_prompt: \"Use $sub2api-admin to inspect and manage Sub2API backend accounts safely.\"\n\npolicy:\n  allow_implicit_invocation: true\n"},"items":[{"name":"openai.yaml","path":"skills/sub2api-admin/agents/openai.yaml","rawUrl":"https://raw.githubusercontent.com/Wei-Shaw/sub2api/HEAD/skills/sub2api-admin/agents/openai.yaml","title":"Agents Skill","category":"anthropic-skill","format":"yaml","content":"interface:\n  display_name: \"Sub2API Admin\"\n  short_description: \"Manage Sub2API admin accounts and settings\"\n  default_prompt: \"Use $sub2api-admin to inspect and manage Sub2API backend accounts safely.\"\n\npolicy:\n  allow_implicit_invocation: true\n","isInternal":false,"tokens":59,"sizeBytes":246},{"name":"admin-cli.md","path":"skills/sub2api-admin/references/admin-cli.md","rawUrl":"https://raw.githubusercontent.com/Wei-Shaw/sub2api/HEAD/skills/sub2api-admin/references/admin-cli.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Sub2API Admin Reference\n\n## Environment\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# 或者，未配置管理员 API Key 时使用管理员 JWT：\n# export SUB2API_JWT='<admin access_token>'\n```\n\n后台鉴权优先使用 `SUB2API_ADMIN_API_KEY` 发送 `x-api-key`，未设置时使用 `SUB2API_JWT` 发送 `Authorization: Bearer <jwt>`。如果返回 `INVALID_ADMIN_KEY`，重新生成管理员 API Key；如果使用 JWT，先用管理员邮箱密码登录并从响应的 `data.access_token` 复制 token：\n\n```bash\ncurl -sS \"$SUB2API_BASE_URL/api/v1/auth/login\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"email\":\"admin@example.com\",\"password\":\"your-password\"}'\n```\n\n## CLI\n\n以下命令都假设当前目录是这个 skill 目录。\n\n```bash\nnode scripts/sub2api-admin.js <command>\n```\n\n## Accounts\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts list --search outlook --platform openai --type oauth --status active\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts stats 40 --days 30\nnode scripts/sub2api-admin.js accounts today-stats 40\nnode scripts/sub2api-admin.js accounts batch-today-stats --ids 40,39\nnode scripts/sub2api-admin.js accounts models 40\nnode scripts/sub2api-admin.js accounts temp-unschedulable 40\nnode scripts/sub2api-admin.js accounts antigravity-default-model-mapping\n```\n\n`accounts export` 会包含账号凭据和 token，建议写入文件，不要直接刷屏：\n\n```bash\nnode scripts/sub2api-admin.js accounts export --ids 40,39 --file accounts-export.json\nnode scripts/sub2api-admin.js accounts export --platform openai --type oauth --include-proxies false --file accounts-export.json\n```\n\n### 单账号写入\n\n```bash\nnode scripts/sub2api-admin.js accounts create --file account.json\nnode scripts/sub2api-admin.js accounts update 40 --json '{\"concurrency\":20}'\nnode scripts/sub2api-admin.js accounts set-status 40 active\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts clear-error 40\nnode scripts/sub2api-admin.js accounts clear-rate-limit 40\nnode scripts/sub2api-admin.js accounts recover-state 40\nnode scripts/sub2api-admin.js accounts reset-quota 40\nnode scripts/sub2api-admin.js accounts refresh 40\nnode scripts/sub2api-admin.js accounts test 40\nnode scripts/sub2api-admin.js accounts sync-models 40\nnode scripts/sub2api-admin.js accounts apply-oauth 40 --file credentials.json\nnode scripts/sub2api-admin.js accounts reset-temp-unschedulable 40\n```\n\n### 删除与清理\n\n删除前先列出目标账号名和 ID。\n\n```bash\nnode scripts/sub2api-admin.js accounts delete 25\nnode scripts/sub2api-admin.js accounts keep-only --name 'target@example.com'\n```\n\n### 批量写入\n\n```bash\nnode scripts/sub2api-admin.js accounts batch-create --file accounts.json\nnode scripts/sub2api-admin.js accounts batch-update-credentials --file payload.json\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10,\"priority\":2}'\nnode scripts/sub2api-admin.js accounts batch-refresh --ids 40,39\nnode scripts/sub2api-admin.js accounts batch-clear-error --ids 40,39\n```\n\n`bulk-update` 可覆盖页面“批量更新”的字段，payload 由后台表单字段决定，例如 `base_url`、`model_mapping`、`group_ids`、`proxy_id`、`concurrency`、`priority`、`rate_multiplier`、`status`、`compact_mode` 等。更新前先用 `accounts get <id>` 确认字段名。\n\n### 导入\n\n通用后台导入：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-data --file accounts-export.json\nnode scripts/sub2api-admin.js accounts import-codex-session --file payload.json\n```\n\nCRS 同步：\n\n```bash\nnode scripts/sub2api-admin.js accounts crs-preview --file payload.json\nnode scripts/sub2api-admin.js accounts crs-sync --file payload.json\n```\n\n旧版 JSON 导入仍可用，会把模板账号的配置复制给导入账号：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-json \\\n  --file /path/accounts.json \\\n  --template-name 'template@example.com' \\\n  --dry-run\n```\n\n复制字段：\n\n- `concurrency`\n- `priority`\n- `group_ids`\n- `credentials.model_mapping`\n\n## Groups And Proxies\n\n```bash\nnode scripts/sub2api-admin.js groups all\nnode scripts/sub2api-admin.js proxies all\n```\n\n## Redeem Codes\n\n兑换码类型包括 `balance`、`concurrency`、`subscription`、`invitation`。状态常用 `unused`、`used`、`expired`。\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes list --type balance --status unused --search user@example.com\nnode scripts/sub2api-admin.js redeem-codes get 123\nnode scripts/sub2api-admin.js redeem-codes stats\nnode scripts/sub2api-admin.js redeem-codes export --file redeem-codes.csv\n```\n\n### 生成兑换码\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' \\\n  --idempotency-key \"redeem-generate-$(date +%s)\"\n```\n\n订阅兑换码需要 `group_id` 和非零 `validity_days`：\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"subscription\",\"value\":0,\"group_id\":2,\"validity_days\":30}' \\\n  --idempotency-key \"redeem-subscription-$(date +%s)\"\n```\n\n### 创建并兑换\n\n用于支付回调或人工充值，一步完成创建兑换码并兑换到用户。生产流程必须传稳定的 `--idempotency-key`。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem \\\n  --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123,\"notes\":\"manual recharge\"}' \\\n  --idempotency-key order-123\n```\n\n### 修改与清理\n\n写入前先 `list` 或 `get` 核对目标 ID。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes batch-update --ids 123,124 --json '{\"notes\":\"campaign A\"}'\nnode scripts/sub2api-admin.js redeem-codes expire 123\nnode scripts/sub2api-admin.js redeem-codes delete 123\nnode scripts/sub2api-admin.js redeem-codes batch-delete --ids 123,124\n```\n\n## Error Rules And TLS Profiles\n\n对应账号页顶部“错误透传规则”和“TLS 指纹模板”。\n\n```bash\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js error-rules get 1\nnode scripts/sub2api-admin.js error-rules create --file rule.json\nnode scripts/sub2api-admin.js error-rules update 1 --json '{\"enabled\":true}'\nnode scripts/sub2api-admin.js error-rules toggle 1 false\nnode scripts/sub2api-admin.js error-rules delete 1\n\nnode scripts/sub2api-admin.js tls-profiles list\nnode scripts/sub2api-admin.js tls-profiles get 1\nnode scripts/sub2api-admin.js tls-profiles create --file profile.json\nnode scripts/sub2api-admin.js tls-profiles update 1 --file profile.json\nnode scripts/sub2api-admin.js tls-profiles delete 1\n```\n\n## Raw Admin API\n\n未封装或新版本后台接口可用 `api` 直通。路径可写 `/admin/...` 或 `/api/v1/admin/...`。\n\n```bash\nnode scripts/sub2api-admin.js api GET /admin/groups/all\nnode scripts/sub2api-admin.js api POST /admin/accounts/bulk-update \\\n  --json '{\"account_ids\":[40],\"concurrency\":10}'\n```\n\n## Confirmed Admin Endpoints\n\n- `GET /api/v1/admin/accounts`\n- `GET /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts`\n- `PUT /api/v1/admin/accounts/:id`\n- `DELETE /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts/check-mixed-channel`\n- `GET /api/v1/admin/accounts/:id/usage`\n- `GET /api/v1/admin/accounts/:id/stats`\n- `GET /api/v1/admin/accounts/:id/today-stats`\n- `POST /api/v1/admin/accounts/today-stats/batch`\n- `POST /api/v1/admin/accounts/:id/schedulable`\n- `POST /api/v1/admin/accounts/:id/test`\n- `POST /api/v1/admin/accounts/:id/refresh`\n- `POST /api/v1/admin/accounts/:id/apply-oauth-credentials`\n- `POST /api/v1/admin/accounts/:id/clear-error`\n- `POST /api/v1/admin/accounts/:id/clear-rate-limit`\n- `POST /api/v1/admin/accounts/:id/recover-state`\n- `POST /api/v1/admin/accounts/:id/reset-quota`\n- `GET /api/v1/admin/accounts/:id/temp-unschedulable`\n- `DELETE /api/v1/admin/accounts/:id/temp-unschedulable`\n- `GET /api/v1/admin/accounts/:id/models`\n- `POST /api/v1/admin/accounts/:id/models/sync-upstream`\n- `POST /api/v1/admin/accounts/batch`\n- `POST /api/v1/admin/accounts/batch-update-credentials`\n- `POST /api/v1/admin/accounts/bulk-update`\n- `POST /api/v1/admin/accounts/batch-refresh`\n- `POST /api/v1/admin/accounts/batch-clear-error`\n- `GET /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/import/codex-session`\n- `POST /api/v1/admin/accounts/sync/crs/preview`\n- `POST /api/v1/admin/accounts/sync/crs`\n- `GET /api/v1/admin/accounts/antigravity/default-model-mapping`\n- `GET /api/v1/admin/groups/all`\n- `GET /api/v1/admin/proxies/all`\n- `GET /api/v1/admin/redeem-codes`\n- `GET /api/v1/admin/redeem-codes/export`\n- `GET /api/v1/admin/redeem-codes/stats`\n- `GET /api/v1/admin/redeem-codes/:id`\n- `POST /api/v1/admin/redeem-codes/generate`\n- `POST /api/v1/admin/redeem-codes/create-and-redeem`\n- `POST /api/v1/admin/redeem-codes/batch-update`\n- `POST /api/v1/admin/redeem-codes/batch-delete`\n- `POST /api/v1/admin/redeem-codes/:id/expire`\n- `DELETE /api/v1/admin/redeem-codes/:id`\n- `GET /api/v1/admin/error-passthrough-rules`\n- `GET /api/v1/admin/error-passthrough-rules/:id`\n- `POST /api/v1/admin/error-passthrough-rules`\n- `PUT /api/v1/admin/error-passthrough-rules/:id`\n- `DELETE /api/v1/admin/error-passthrough-rules/:id`\n- `GET /api/v1/admin/tls-fingerprint-profiles`\n- `GET /api/v1/admin/tls-fingerprint-profiles/:id`\n- `POST /api/v1/admin/tls-fingerprint-profiles`\n- `PUT /api/v1/admin/tls-fingerprint-profiles/:id`\n- `DELETE /api/v1/admin/tls-fingerprint-profiles/:id`\n\n## Notes\n\n- 线上写入前先只读核对目标集合。\n- 导出结果包含敏感凭据，优先使用 `--file`。\n- `PUT /admin/accounts/:id` 和 `bulk-update` 接受宽松请求体，字段名不确定时先用 `accounts get` 或后台页面确认。\n","isInternal":false,"tokens":2879,"sizeBytes":10013},{"name":"SKILL.md","path":"skills/sub2api-admin/SKILL.md","rawUrl":"https://raw.githubusercontent.com/Wei-Shaw/sub2api/HEAD/skills/sub2api-admin/SKILL.md","title":"sub2api-admin","category":"anthropic-skill","format":"markdown","content":"---\nname: sub2api-admin\ndescription: Manage Sub2API admin APIs for accounts, redeem codes, groups, proxies, error passthrough rules, TLS fingerprint profiles, imports, exports, batch updates, and raw administrator API calls. Use when the user mentions Sub2API, admin API keys, account management, redeem code management, recharge codes, invitation codes, bulk account import/export, keeping or deleting accounts, refreshing accounts, clearing errors, CRS sync, or managing Sub2API backend settings through the admin API.\n---\n\n# Sub2API Admin\n\nUse the bundled CLI instead of ad hoc `curl`. Run examples from this skill directory.\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# Or, when the deployment uses admin JWT login instead of an admin API key:\n# export SUB2API_JWT='<admin access_token>'\nnode scripts/sub2api-admin.js accounts list\n```\n\nFor all commands and payload examples, read [references/admin-cli.md](references/admin-cli.md).\n\n## Workflow\n\n1. Reuse `SUB2API_BASE_URL` and either `SUB2API_ADMIN_API_KEY` or `SUB2API_JWT` from the environment.\n2. Run read-only commands first: `accounts list`, `accounts get <id>`, `groups all`, or `proxies all`.\n3. Before destructive or bulk writes, print the target account names and IDs.\n4. Execute the write command only after the target set is clear.\n5. Run a follow-up read command to verify the result.\n\n## Common Commands\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10}'\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes generate --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' --idempotency-key redeem-$(date +%s)\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123}' --idempotency-key order-123\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js tls-profiles list\n```\n\n## Safety Notes\n\n- Authentication uses `x-api-key` from `SUB2API_ADMIN_API_KEY` first, then falls back to `Authorization: Bearer <jwt>` from `SUB2API_JWT`.\n- If the API returns `INVALID_ADMIN_KEY`, ask the user to regenerate the admin API key. If using JWT, log in as an admin user and copy the `access_token` from `POST /api/v1/auth/login`.\n- `accounts export` includes credentials and tokens. Prefer `--file` and avoid printing exports in chat.\n- Redeem code create/redeem commands should use `--idempotency-key` for payment or recharge workflows.\n- For uncertain or newly added backend APIs, use `api <METHOD> <admin-path>` after a read-only check.\n","frontmatter":{"name":"sub2api-admin","description":"Manage Sub2API admin APIs for accounts, redeem codes, groups, proxies, error passthrough rules, TLS fingerprint profiles, imports, exports, batch updates, and raw administrator API calls. Use when the user mentions Sub2API, admin API keys, account management, redeem code management, recharge codes, invitation codes, bulk account import/export, keeping or deleting accounts, refreshing accounts, clearing errors, CRS sync, or managing Sub2API backend settings through the admin API."},"isInternal":false,"tokens":706,"sizeBytes":2868}],"systemPromptSnippet":"<yakaai_skills repo=\"Wei-Shaw/sub2api\">\n<!-- File: skills/sub2api-admin/agents/openai.yaml (Tokens: ~59 | Category: anthropic-skill) -->\ninterface:\n  display_name: \"Sub2API Admin\"\n  short_description: \"Manage Sub2API admin accounts and settings\"\n  default_prompt: \"Use $sub2api-admin to inspect and manage Sub2API backend accounts safely.\"\n\npolicy:\n  allow_implicit_invocation: true\n\n<!-- File: skills/sub2api-admin/references/admin-cli.md (Tokens: ~2879 | Category: anthropic-skill) -->\n# Sub2API Admin Reference\n\n## Environment\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# 或者，未配置管理员 API Key 时使用管理员 JWT：\n# export SUB2API_JWT='<admin access_token>'\n```\n\n后台鉴权优先使用 `SUB2API_ADMIN_API_KEY` 发送 `x-api-key`，未设置时使用 `SUB2API_JWT` 发送 `Authorization: Bearer <jwt>`。如果返回 `INVALID_ADMIN_KEY`，重新生成管理员 API Key；如果使用 JWT，先用管理员邮箱密码登录并从响应的 `data.access_token` 复制 token：\n\n```bash\ncurl -sS \"$SUB2API_BASE_URL/api/v1/auth/login\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"email\":\"admin@example.com\",\"password\":\"your-password\"}'\n```\n\n## CLI\n\n以下命令都假设当前目录是这个 skill 目录。\n\n```bash\nnode scripts/sub2api-admin.js <command>\n```\n\n## Accounts\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts list --search outlook --platform openai --type oauth --status active\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts stats 40 --days 30\nnode scripts/sub2api-admin.js accounts today-stats 40\nnode scripts/sub2api-admin.js accounts batch-today-stats --ids 40,39\nnode scripts/sub2api-admin.js accounts models 40\nnode scripts/sub2api-admin.js accounts temp-unschedulable 40\nnode scripts/sub2api-admin.js accounts antigravity-default-model-mapping\n```\n\n`accounts export` 会包含账号凭据和 token，建议写入文件，不要直接刷屏：\n\n```bash\nnode scripts/sub2api-admin.js accounts export --ids 40,39 --file accounts-export.json\nnode scripts/sub2api-admin.js accounts export --platform openai --type oauth --include-proxies false --file accounts-export.json\n```\n\n### 单账号写入\n\n```bash\nnode scripts/sub2api-admin.js accounts create --file account.json\nnode scripts/sub2api-admin.js accounts update 40 --json '{\"concurrency\":20}'\nnode scripts/sub2api-admin.js accounts set-status 40 active\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts clear-error 40\nnode scripts/sub2api-admin.js accounts clear-rate-limit 40\nnode scripts/sub2api-admin.js accounts recover-state 40\nnode scripts/sub2api-admin.js accounts reset-quota 40\nnode scripts/sub2api-admin.js accounts refresh 40\nnode scripts/sub2api-admin.js accounts test 40\nnode scripts/sub2api-admin.js accounts sync-models 40\nnode scripts/sub2api-admin.js accounts apply-oauth 40 --file credentials.json\nnode scripts/sub2api-admin.js accounts reset-temp-unschedulable 40\n```\n\n### 删除与清理\n\n删除前先列出目标账号名和 ID。\n\n```bash\nnode scripts/sub2api-admin.js accounts delete 25\nnode scripts/sub2api-admin.js accounts keep-only --name 'target@example.com'\n```\n\n### 批量写入\n\n```bash\nnode scripts/sub2api-admin.js accounts batch-create --file accounts.json\nnode scripts/sub2api-admin.js accounts batch-update-credentials --file payload.json\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10,\"priority\":2}'\nnode scripts/sub2api-admin.js accounts batch-refresh --ids 40,39\nnode scripts/sub2api-admin.js accounts batch-clear-error --ids 40,39\n```\n\n`bulk-update` 可覆盖页面“批量更新”的字段，payload 由后台表单字段决定，例如 `base_url`、`model_mapping`、`group_ids`、`proxy_id`、`concurrency`、`priority`、`rate_multiplier`、`status`、`compact_mode` 等。更新前先用 `accounts get <id>` 确认字段名。\n\n### 导入\n\n通用后台导入：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-data --file accounts-export.json\nnode scripts/sub2api-admin.js accounts import-codex-session --file payload.json\n```\n\nCRS 同步：\n\n```bash\nnode scripts/sub2api-admin.js accounts crs-preview --file payload.json\nnode scripts/sub2api-admin.js accounts crs-sync --file payload.json\n```\n\n旧版 JSON 导入仍可用，会把模板账号的配置复制给导入账号：\n\n```bash\nnode scripts/sub2api-admin.js accounts import-json \\\n  --file /path/accounts.json \\\n  --template-name 'template@example.com' \\\n  --dry-run\n```\n\n复制字段：\n\n- `concurrency`\n- `priority`\n- `group_ids`\n- `credentials.model_mapping`\n\n## Groups And Proxies\n\n```bash\nnode scripts/sub2api-admin.js groups all\nnode scripts/sub2api-admin.js proxies all\n```\n\n## Redeem Codes\n\n兑换码类型包括 `balance`、`concurrency`、`subscription`、`invitation`。状态常用 `unused`、`used`、`expired`。\n\n### 只读\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes list --type balance --status unused --search user@example.com\nnode scripts/sub2api-admin.js redeem-codes get 123\nnode scripts/sub2api-admin.js redeem-codes stats\nnode scripts/sub2api-admin.js redeem-codes export --file redeem-codes.csv\n```\n\n### 生成兑换码\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' \\\n  --idempotency-key \"redeem-generate-$(date +%s)\"\n```\n\n订阅兑换码需要 `group_id` 和非零 `validity_days`：\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes generate \\\n  --json '{\"count\":1,\"type\":\"subscription\",\"value\":0,\"group_id\":2,\"validity_days\":30}' \\\n  --idempotency-key \"redeem-subscription-$(date +%s)\"\n```\n\n### 创建并兑换\n\n用于支付回调或人工充值，一步完成创建兑换码并兑换到用户。生产流程必须传稳定的 `--idempotency-key`。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem \\\n  --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123,\"notes\":\"manual recharge\"}' \\\n  --idempotency-key order-123\n```\n\n### 修改与清理\n\n写入前先 `list` 或 `get` 核对目标 ID。\n\n```bash\nnode scripts/sub2api-admin.js redeem-codes batch-update --ids 123,124 --json '{\"notes\":\"campaign A\"}'\nnode scripts/sub2api-admin.js redeem-codes expire 123\nnode scripts/sub2api-admin.js redeem-codes delete 123\nnode scripts/sub2api-admin.js redeem-codes batch-delete --ids 123,124\n```\n\n## Error Rules And TLS Profiles\n\n对应账号页顶部“错误透传规则”和“TLS 指纹模板”。\n\n```bash\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js error-rules get 1\nnode scripts/sub2api-admin.js error-rules create --file rule.json\nnode scripts/sub2api-admin.js error-rules update 1 --json '{\"enabled\":true}'\nnode scripts/sub2api-admin.js error-rules toggle 1 false\nnode scripts/sub2api-admin.js error-rules delete 1\n\nnode scripts/sub2api-admin.js tls-profiles list\nnode scripts/sub2api-admin.js tls-profiles get 1\nnode scripts/sub2api-admin.js tls-profiles create --file profile.json\nnode scripts/sub2api-admin.js tls-profiles update 1 --file profile.json\nnode scripts/sub2api-admin.js tls-profiles delete 1\n```\n\n## Raw Admin API\n\n未封装或新版本后台接口可用 `api` 直通。路径可写 `/admin/...` 或 `/api/v1/admin/...`。\n\n```bash\nnode scripts/sub2api-admin.js api GET /admin/groups/all\nnode scripts/sub2api-admin.js api POST /admin/accounts/bulk-update \\\n  --json '{\"account_ids\":[40],\"concurrency\":10}'\n```\n\n## Confirmed Admin Endpoints\n\n- `GET /api/v1/admin/accounts`\n- `GET /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts`\n- `PUT /api/v1/admin/accounts/:id`\n- `DELETE /api/v1/admin/accounts/:id`\n- `POST /api/v1/admin/accounts/check-mixed-channel`\n- `GET /api/v1/admin/accounts/:id/usage`\n- `GET /api/v1/admin/accounts/:id/stats`\n- `GET /api/v1/admin/accounts/:id/today-stats`\n- `POST /api/v1/admin/accounts/today-stats/batch`\n- `POST /api/v1/admin/accounts/:id/schedulable`\n- `POST /api/v1/admin/accounts/:id/test`\n- `POST /api/v1/admin/accounts/:id/refresh`\n- `POST /api/v1/admin/accounts/:id/apply-oauth-credentials`\n- `POST /api/v1/admin/accounts/:id/clear-error`\n- `POST /api/v1/admin/accounts/:id/clear-rate-limit`\n- `POST /api/v1/admin/accounts/:id/recover-state`\n- `POST /api/v1/admin/accounts/:id/reset-quota`\n- `GET /api/v1/admin/accounts/:id/temp-unschedulable`\n- `DELETE /api/v1/admin/accounts/:id/temp-unschedulable`\n- `GET /api/v1/admin/accounts/:id/models`\n- `POST /api/v1/admin/accounts/:id/models/sync-upstream`\n- `POST /api/v1/admin/accounts/batch`\n- `POST /api/v1/admin/accounts/batch-update-credentials`\n- `POST /api/v1/admin/accounts/bulk-update`\n- `POST /api/v1/admin/accounts/batch-refresh`\n- `POST /api/v1/admin/accounts/batch-clear-error`\n- `GET /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/data`\n- `POST /api/v1/admin/accounts/import/codex-session`\n- `POST /api/v1/admin/accounts/sync/crs/preview`\n- `POST /api/v1/admin/accounts/sync/crs`\n- `GET /api/v1/admin/accounts/antigravity/default-model-mapping`\n- `GET /api/v1/admin/groups/all`\n- `GET /api/v1/admin/proxies/all`\n- `GET /api/v1/admin/redeem-codes`\n- `GET /api/v1/admin/redeem-codes/export`\n- `GET /api/v1/admin/redeem-codes/stats`\n- `GET /api/v1/admin/redeem-codes/:id`\n- `POST /api/v1/admin/redeem-codes/generate`\n- `POST /api/v1/admin/redeem-codes/create-and-redeem`\n- `POST /api/v1/admin/redeem-codes/batch-update`\n- `POST /api/v1/admin/redeem-codes/batch-delete`\n- `POST /api/v1/admin/redeem-codes/:id/expire`\n- `DELETE /api/v1/admin/redeem-codes/:id`\n- `GET /api/v1/admin/error-passthrough-rules`\n- `GET /api/v1/admin/error-passthrough-rules/:id`\n- `POST /api/v1/admin/error-passthrough-rules`\n- `PUT /api/v1/admin/error-passthrough-rules/:id`\n- `DELETE /api/v1/admin/error-passthrough-rules/:id`\n- `GET /api/v1/admin/tls-fingerprint-profiles`\n- `GET /api/v1/admin/tls-fingerprint-profiles/:id`\n- `POST /api/v1/admin/tls-fingerprint-profiles`\n- `PUT /api/v1/admin/tls-fingerprint-profiles/:id`\n- `DELETE /api/v1/admin/tls-fingerprint-profiles/:id`\n\n## Notes\n\n- 线上写入前先只读核对目标集合。\n- 导出结果包含敏感凭据，优先使用 `--file`。\n- `PUT /admin/accounts/:id` 和 `bulk-update` 接受宽松请求体，字段名不确定时先用 `accounts get` 或后台页面确认。\n\n<!-- File: skills/sub2api-admin/SKILL.md (Tokens: ~706 | Category: anthropic-skill) -->\n---\nname: sub2api-admin\ndescription: Manage Sub2API admin APIs for accounts, redeem codes, groups, proxies, error passthrough rules, TLS fingerprint profiles, imports, exports, batch updates, and raw administrator API calls. Use when the user mentions Sub2API, admin API keys, account management, redeem code management, recharge codes, invitation codes, bulk account import/export, keeping or deleting accounts, refreshing accounts, clearing errors, CRS sync, or managing Sub2API backend settings through the admin API.\n---\n\n# Sub2API Admin\n\nUse the bundled CLI instead of ad hoc `curl`. Run examples from this skill directory.\n\n```bash\nexport SUB2API_BASE_URL='https://your-sub2api-host'\nexport SUB2API_ADMIN_API_KEY='<admin api key>'\n# Or, when the deployment uses admin JWT login instead of an admin API key:\n# export SUB2API_JWT='<admin access_token>'\nnode scripts/sub2api-admin.js accounts list\n```\n\nFor all commands and payload examples, read [references/admin-cli.md](references/admin-cli.md).\n\n## Workflow\n\n1. Reuse `SUB2API_BASE_URL` and either `SUB2API_ADMIN_API_KEY` or `SUB2API_JWT` from the environment.\n2. Run read-only commands first: `accounts list`, `accounts get <id>`, `groups all`, or `proxies all`.\n3. Before destructive or bulk writes, print the target account names and IDs.\n4. Execute the write command only after the target set is clear.\n5. Run a follow-up read command to verify the result.\n\n## Common Commands\n\n```bash\nnode scripts/sub2api-admin.js accounts list --page-size 20\nnode scripts/sub2api-admin.js accounts get 40\nnode scripts/sub2api-admin.js accounts usage 40\nnode scripts/sub2api-admin.js accounts set-schedulable 40 true\nnode scripts/sub2api-admin.js accounts bulk-update --ids 40,39 --json '{\"concurrency\":10}'\nnode scripts/sub2api-admin.js redeem-codes list --page-size 20\nnode scripts/sub2api-admin.js redeem-codes generate --json '{\"count\":1,\"type\":\"balance\",\"value\":10}' --idempotency-key redeem-$(date +%s)\nnode scripts/sub2api-admin.js redeem-codes create-and-redeem --json '{\"code\":\"order_123\",\"type\":\"balance\",\"value\":10,\"user_id\":123}' --idempotency-key order-123\nnode scripts/sub2api-admin.js error-rules list\nnode scripts/sub2api-admin.js tls-profiles list\n```\n\n## Safety Notes\n\n- Authentication uses `x-api-key` from `SUB2API_ADMIN_API_KEY` first, then falls back to `Authorization: Bearer <jwt>` from `SUB2API_JWT`.\n- If the API returns `INVALID_ADMIN_KEY`, ask the user to regenerate the admin API key. If using JWT, log in as an admin user and copy the `access_token` from `POST /api/v1/auth/login`.\n- `accounts export` includes credentials and tokens. Prefer `--file` and avoid printing exports in chat.\n- Redeem code create/redeem commands should use `--idempotency-key` for payment or recharge workflows.\n- For uncertain or newly added backend APIs, use `api <METHOD> <admin-path>` after a read-only check.\n</yakaai_skills>"}