You.com Web Search & Research API
通过 HTTP 直接调用 You.com 的研究、搜索和内容提取 API,无需 SDK。
OpenClaw 平台的 API 密钥安全存储与迁移工具,支持一键加密和动态识别。
openclaw skills install @maverick-software/api-key-ui-tab命令、参数、文件名以原文为准
OpenClaw 控制面板的 Vault 后端 API 密钥管理功能。密钥存储在安全文件中(~/.openclaw/secrets.json,权限 0600),并通过 OpenClaw 内置的 Secrets System 进行引用。AI 代理不会看到您的密钥。
| 组件 | 状态 |
|---|---|
| Vault 文件存储 | ✅ 正常运行 |
| 密钥引用(SecretRef) | ✅ 正常运行 |
| 动态密钥发现 | ✅ 正常运行 |
| 一键迁移 | ✅ 正常运行 |
| 插件注册标签页 | ✅ 正常运行 |
| Vault 状态横幅 | ✅ 正常运行 |
| 密钥状态徽章 | ✅ 正常运行 |
| 仅 Vault 密钥区域 | ✅ 正常运行 |
| 手动 "+ 添加密钥" 表单 | ✅ 正常运行 |
| 重启通知横幅 | ✅ 正常运行 |
| 技能 Vault 密钥选择器 | ✅ 正常运行 |
| 技能内联密钥创建 | ✅ 正常运行 |
| 认证配置文件显示 | ✅ 正常运行 |
密钥存储于 ~/.openclaw/secrets.json(文件权限 0600)。保存密钥时,UI 将:
openclaw.json 中配置文件密钥提供者(如尚未存在)SecretRef 对象迁移前配置:
{
"env": {
"OPENAI_API_KEY": "sk-proj-abc123..."
}
}迁移后配置:
{
"env": {
"OPENAI_API_KEY": { "source": "file", "provider": "default", "id": "/OPENAI_API_KEY" }
},
"secrets": {
"providers": {
"default": { "source": "file", "path": "~/.openclaw/secrets.json", "mode": "json" }
},
"defaults": { "file": "default" }
}
}**Vault 文件(~/.openclaw/secrets.json):**
{
"OPENAI_API_KEY": "sk-proj-abc123..."
}当检测到明文密钥时,“🔒 迁移到 Vault”按钮将出现。它会:
openclaw.json 中所有明文 API 密钥SecretRef 对象替换UI 会自动扫描整个配置中的 API 密钥 —— 无需硬编码列表。
检测模式: apiKey, api_key, token, secret, *_KEY, *_TOKEN, *_SECRET
扫描位置:
env.* —— 环境变量skills.entries.*.apiKey —— 技能专属密钥messages.tts.*.apiKey —— TTS 提供商密钥已知提供者 会显示友好名称、描述和“获取密钥 ↗”链接:
| 提供者 | 环境变量键 |
|---|---|
| Anthropic | ANTHROPIC_API_KEY |
| OpenAI | OPENAI_API_KEY |
| Google / Gemini | GOOGLE_API_KEY / GEMINI_API_KEY |
| Brave Search | BRAVE_API_KEY |
| ElevenLabs | ELEVENLABS_API_KEY |
| Deepgram | DEEPGRAM_API_KEY |
| OpenRouter | OPENROUTER_API_KEY |
| Groq | GROQ_API_KEY |
| Fireworks | FIREWORKS_API_KEY |
| Mistral | MISTRAL_API_KEY |
| xAI (Grok) | XAI_API_KEY |
| Perplexity | PERPLEXITY_API_KEY |
| GitHub | GITHUB_TOKEN |
| Hume AI | HUME_API_KEY / HUME_SECRET_KEY |
页面顶部显示:
每个密钥行显示:
存储在 Vault 中但未被任何配置路径引用的密钥将显示在专用的“仅 Vault 密钥”卡片中。这些是手动创建或由技能生成但无对应环境/配置条目的密钥。每项显示:
Vault 标签页标题包含一个 "+ 添加密钥" 按钮,点击后展开内联表单:
envEntry: false —— 不创建配置条目,不触发重启当 Vault 写入触发配置变更时,会出现黄色警告横幅:
⚠ 新增密钥需要重启网关才能生效。
[立即重启]
该横幅将持续显示,直到用户点击“立即重启”或刷新页面。此功能取代了此前导致意外重启的自动重载行为。
在技能标签页中,声明了 primaryEnv 的技能将使用 Vault 密钥选择器,而非原始密码输入框:
未绑定时:
skills.entries.<key>.apiKey 中写入 SecretRef已绑定时:
🔒 KEY_NAME 及“解除绑定”按钮SecretRef内联密钥创建:
所有技能组(工作区、内置、托管)默认展开(<details open>),提升可发现性。此前工作区和内置技能组默认折叠。
存储在 Vault 中的认证配置文件密钥(来自 auth-profiles.json)将按状态列出。后端 RPC 支持列出、错误重置和删除操作。
markdown
┌──────────────────────────────────────────────────────────┐
│ 浏览器 │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Vault 选项卡 │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ OpenAI: [••••••••••] [保存] [✕] 🟢已启用 │ │ │
│ │ │ Anthropic: [ ] [保存] ⚪未设置 │ │ │
│ │ │ + 添加密钥 [KEY_NAME] [值] [保存] │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Skills 选项卡 │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ whisper-api: 🔒 OPENAI_API_KEY [解除链接] │ │ │
│ │ │ sag: [选择 Vault 密钥 ▾] │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ ▼ (直接 RPC 调用,不通过代理) │
└───────────────────────────┼───────────────────────────────┘
│
┌───────▼───────┐
│ 网关 │
│ secrets.write │
│ skills.update │
└──┬─────────┬──┘
│ │
┌────────▼──┐ ┌──▼────────────┐
│ secrets. │ │ openclaw.json │
│ json │ │ (仅包含 SecretRef │
│ (0600) │ │ 对象) │
└────────────┘ └────────────────┘
| 方法 | 说明 |
|---|---|
secrets.status | 获取 Vault 文件状态、密钥数量、明文密钥数量 |
secrets.list | 列出所有密钥 ID 及其掩码后的值 |
secrets.write | 将密钥存入 Vault,可选地更新配置中的 SecretRef。envEntry 参数(默认为 true)控制是否创建环境变量块条目。返回 restartNeeded 标志而非自动重新加载。 |
secrets.delete | 从 Vault 和配置中移除密钥 |
secrets.migrate | 批量将所有明文密钥迁移至 Vault |
secrets.authProfiles.list | 列出认证配置的密钥及其 Vault 状态 |
secrets.authProfiles.resetErrors | 重置认证配置的错误状态 |
secrets.authProfiles.delete | 删除某个认证配置 |
skills.update | 支持 vaultKeyId 参数 —— 在 skills.entries.<key>.apiKey 中写入 SecretRef,或设为空字符串以解除链接 |
SkillStatusEntry 包含 vaultKeyId 字段,该字段读取的是原始配置 JSON(非运行时解析后的配置,其中 SecretRef 已被替换为实际值)。此功能通过 extractVaultKeyIdFromConfig() 实现,直接读取并缓存 openclaw.json,检查 skills.entries.<key>.apiKey 中是否存在 SecretRef 对象。
不自动重启。 之前 secrets.write 会调用 reloadSecrets(),可能触发网关重启。现在:
envEntry: false)不会修改配置 —— 无需重启restartNeeded: true —— UI 显示重启提示横幅writeConfigFile() 写入配置 —— 触发配置文件监视器,导致网关重启(由配置监视系统固有机制决定)本技能使用 OpenClaw 内置的密钥系统(src/secrets/):
{ source: "file", path: "~/.openclaw/secrets.json", mode: "json" }{ source: "file", provider: "default", id: "/<KEY_NAME>" }prepareSecretsRuntimeSnapshot() 在网关启动时解析所有引用该密钥系统还支持 env 和 exec 提供者,适用于高级场景(如环境变量、外部密钥工具命令)。文件提供者是此 UI 的默认选项。
| 文件 | 用途 |
|---|---|
src/gateway/server-methods/secrets.ts | Vault RPC 接口(status、list、write、delete、migrate、authProfiles) |
src/gateway/server-methods/skills.ts | 支持 vaultKeyId 参数的 Skills 更新 |
src/gateway/server-methods/plugins-ui.ts | 插件视图注册 |
src/gateway/protocol/schema/agents-models-skills.ts | vaultKeyId 在 SkillsUpdateParamsSchema 中的定义 |
src/agents/skills-status.ts | SkillStatusEntry 中的 vaultKeyId 字段,原始配置读取器 |
ui/src/ui/controllers/apikeys.ts | 支持 Vault 的状态管理,addVaultSecret,loadVaultOnlyKeys |
ui/src/ui/controllers/skills.ts | VaultKeyEntry 类型,loadVaultKeys,linkSkillToVaultKey,addVaultKeyAndLink |
ui/src/ui/views/apikeys.ts | Vault UI(提示横幅、徽章、迁移流程、添加表单、仅 Vault 密钥、重启提示) |
ui/src/ui/views/skills.ts | Vault 密钥选择下拉框、内联创建、分组展开 |
ui/src/ui/app.ts | 状态属性(vault、restart、技能密钥管理) |
ui/src/ui/app-render.ts | Vault 与 Skills 相关属性的绑定 |
ui/src/ui/app-settings.ts | Vault 密钥的标签页加载触发 |
ui/src/ui/types.ts | SkillStatusEntry 中的 vaultKeyId 定义 |
ui/src/ui/navigation.ts | Vault 选项卡(锁图标),移除了 1Password/Discord 独立标签页 |
markdown
apikeys-ui/
├── SKILL.md # 此文件
├── INSTALL_INSTRUCTIONS.md # 逐步安装说明(旧版)
└── reference/
├── apikeys-controller.ts # UI 控制器(Vault 标签页)
├── apikeys-views.ts # UI 视图(Vault 标签页)
├── secrets-rpc.ts # 后端 Vault RPC 接口
├── skills-controller.ts # UI 控制器(技能 Vault 集成)
├── skills-views.ts # UI 视图(Vault 密钥选择器)
├── skills-status.ts # 后端技能状态,包含 vaultKeyId
└── skills-rpc.ts # 后端技能更新 RPC 接口
secrets.write 不再调用 reloadSecrets()。通过带有“立即重启”按钮的提醒横幅,让用户自行决定何时重启。envEntry: false 创建的密钥不会出现在配置中。通过单独的 secrets.list 调用获取所有 Vault 条目,并在专用区域显示未被引用的孤立密钥。loadConfig() 返回的是已解析的值。extractVaultKeyIdFromConfig() 直接读取原始 JSON 文件(带 mtime 缓存)以检测 SecretRef 对象。<details> 组合均默认展开,提升用户体验。此前折叠默认的隐藏技能需要额外配置。primaryEnv 的技能不再使用密码输入框,而是提供一个 Vault 密钥选择下拉菜单。链接操作会将 SecretRef 写入配置中的 skills.entries.<key>.apiKey。primaryEnv 的技能替换原始密码输入框,改用下拉菜单~/.openclaw/secrets.json(权限 0600),不再以明文形式存在于配置中secrets.status、secrets.list、secrets.write、secrets.delete、secrets.migrateconfig.patch 实现保存/清除功能已收录 2 个 Skill