provider-key-manager

$npx mdskill add aAAaqwq/AGI-Super-Team/provider-key-manager

Rotate API keys instantly across all agents with one command.

  • Eliminates manual edits to over fifteen configuration files.
  • Depends on OpenClaw's ${ENV_VAR} syntax for key injection.
  • Audits and migrates hardcoded keys to a single environment variable.
  • Executes a unified rotation command that updates every agent automatically.
SKILL.md
.github/skills/provider-key-managerView on GitHub ↗
---
name: provider-key-manager
description: Provider key manager — rotate and sync API keys across multi-agent workspaces
---

# Provider Key Manager

> 一条命令更换供应商 API Key,全员生效,零遗漏。

## 痛点

OpenClaw 多 agent 架构下,每个 agent 都有独立的 `models.json`,更换一个 provider key 需要:
1. 修改 `openclaw.json` 全局配置
2. 修改 13+ 个 agent 的 `models.json`
3. 更新 `pass` 存储
4. 重启 Gateway
5. 逐个验证

**一个 key 要改 15+ 处,漏改一个就报错。**

## 方案:环境变量统一引用

OpenClaw 原生支持 `${ENV_VAR}` 语法引用环境变量:

```json
// openclaw.json
{
  "env": {
    "vars": {
      "ZAI_API_KEY": "actual-key-value-here"
    }
  },
  "models": {
    "providers": {
      "zai": {
        "apiKey": "${ZAI_API_KEY}",  // ← 引用环境变量,不硬编码
        "baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4"
      }
    }
  }
}
```

**核心原则**:
- API Key 只存在 `env.vars` 中(单一真相源)
- 所有 provider 的 `apiKey` 用 `"${ENV_VAR}"` 引用
- 各 agent 的 `models.json` **删除 apiKey 字段**,继承全局 provider
- 换 key = 改一个 env var + 重启,全员自动生效

## 触发词

`换key`, `更换key`, `provider key`, `API key 更换`, `模型key`, `key管理`, `供应商密钥`

## 命令

### 1. 审计当前配置

```bash
python3 ~/clawd/skills/provider-key-manager/scripts/manager.py audit
```

扫描所有 agent 的 models.json,报告:
- ✅ 使用 `${ENV_VAR}` 引用的 provider
- ❌ 硬编码 apiKey 的 provider
- ⚠️ key 值不一致的 agent

### 2. 迁移到环境变量模式

```bash
python3 ~/clawd/skills/provider-key-manager/scripts/manager.py migrate [--provider zai] [--dry-run]
```

自动执行:
1. 将 `openclaw.json` 中的硬编码 key 移入 `env.vars`
2. 替换 provider apiKey 为 `"${ENV_VAR}"`
3. 从各 agent models.json 中**删除** apiKey 字段(继承全局)
4. 更新 `pass` 存储
5. 生成迁移报告

### 3. 更换 API Key

```bash
python3 ~/clawd/skills/provider-key-manager/scripts/manager.py update <provider> <new-key> [--base-url <url>]
```

一条命令完成:
1. 更新 `env.vars` 中的 key
2. 如有 agent 仍硬编码,同步更新
3. 更新 `pass` 存储
4. 测试 key 可用性
5. 输出重启命令

### 4. 测试 Key 可用性

```bash
python3 ~/clawd/skills/provider-key-manager/scripts/manager.py test <provider>
```

对指定 provider 发送最小请求,验证 key 有效。

### 5. 查看 Provider 总览

```bash
python3 ~/clawd/skills/provider-key-manager/scripts/manager.py status
```

显示所有 provider 的 key 来源、baseUrl、模型列表。

## Provider ↔ 环境变量映射

| Provider | 环境变量 | pass 路径 |
|----------|---------|----------|
| zai | `ZAI_API_KEY` | `api/zai` |
| xingjiabiapi | `XINGJIABIAPI_KEY` | `api/xingjiabiapi` |
| xai | `XAI_API_KEY` | `api/xai` |
| xingsuancode | `XINGSUANCODE_KEY` | `api/xingsuancode` |
| moonshot | `MOONSHOT_API_KEY` | `api/kimi` |
| minimax | `MINIMAX_API_KEY` | `api/minimax` |
| xinyuan | `XINYUAN_API_KEY` | `api/xinyuan` |
| boluobao | `BOLUOBAO_API_KEY` | `api/boluobao` |
| google | `GOOGLE_API_KEY` | `api/google-ai-studio` |

## 架构图

```
┌─────────────────────────────────┐
│     openclaw.json               │
│  ┌───────────────────────┐      │
│  │ env.vars              │      │
│  │  ZAI_API_KEY: "xxx"   │ ← 单一真相源 (Single Source of Truth)
│  │  XAI_API_KEY: "yyy"   │      │
│  └───────────┬───────────┘      │
│              │ ${ZAI_API_KEY}   │
│  ┌───────────▼───────────┐      │
│  │ models.providers.zai  │      │
│  │  apiKey: "${ZAI_API_KEY}"    │
│  │  baseUrl: "https://..." │    │
│  └───────────────────────┘      │
└─────────────────────────────────┘
              │ 继承
    ┌─────────┼─────────┐
    ▼         ▼         ▼
 agent/     agent/    agent/
 main/      ops/     code/ ...
 models.json models.json
 (无 apiKey,继承全局)
```

## 注意事项

1. **env.vars 中的 key 是明文** — 但 openclaw.json 已在 .gitignore,不会被 commit
2. **per-agent models.json 仍需保留 provider 结构** — 只是删除 apiKey 字段
3. **迁移后换 key 流程**:`manager.py update zai <new-key>` → Gateway 重启 → 完成
4. **回退方案**:迁移前自动备份所有 models.json 到 `/tmp/provider-key-backup/`
More from aAAaqwq/AGI-Super-Team