OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  confidant:实现从人类到 AI 的安全秘密交接

confidant:实现从人类到 AI 的安全秘密交接

 
  hardware ·  2026-02-06 22:40:08 · 3 次点击  · 0 条评论  

名称: confidant
描述: 为 AI 代理提供安全的密钥交接与凭证设置向导。当您需要从用户处获取敏感信息(API 密钥、密码、令牌)或需要将凭证保存到配置文件时使用。切勿通过聊天询问密钥——请使用 Confidant。
主页: https://github.com/aiconnect-cloud/confidant
user-invocable: true
disable-model-invocation: false
元数据:
{
'openclaw':
{
'emoji': '🔐',
'requires': { 'bins': ['curl', 'jq', 'npm'] },
'files': ['scripts/*']
}
}


Confidant

安全地从人类接收密钥——无聊天暴露、无复制粘贴、无历史泄露。

🚨 关键流程 — 请先阅读

这是一个需要人工介入的流程。您无法自行检索密钥。

  1. 运行脚本 → 您将获得一个安全 URL
  2. 在聊天中将此 URL 发送给用户这是强制步骤
  3. 等待用户在浏览器中打开该 URL 并提交密钥
  4. 脚本处理后续事宜(接收、保存到磁盘、确认)
❌ 请勿自行 curl/fetch 密钥 URL — 它是供人类使用的网页表单
❌ 请勿跳过分享 URL — 用户必须在聊天中收到它
❌ 请勿轮询 API 来检查密钥是否到达 — 脚本会处理此事
❌ 未经确认收到密钥,请勿继续操作
✅ 分享 URL → 等待 → 确认成功 → 静默使用密钥

🔧 设置(每个环境一次)

运行一次以下命令以全局安装 CLI(避免缓慢的 npx 调用):

bash {skill}/scripts/setup.sh

{skill} 是包含此 SKILL.md 文件的目录的绝对路径。代理可以在运行时解析它:

```bash
SKILL_DIR=$(find "$HOME" -name "SKILL.md" -path "/confidant/skill" -exec dirname {} \; 2>/dev/null | head -1)

然后使用:bash "$SKILL_DIR/scripts/setup.sh"

```

⚡ 快速开始

您需要用户的 API 密钥?只需一条命令:

bash {skill}/scripts/request-secret.sh --label "OpenAI API Key" --service openai

脚本处理所有事情:

  • ✅ 如果服务器未运行则启动(或重用现有服务器)
  • ✅ 创建带有网页表单的安全请求
  • ✅ 检测现有隧道(ngrok 或 localtunnel)
  • ✅ 返回 URL 以供分享给用户
  • ✅ 轮询直到密钥被提交
  • ✅ 保存到 ~/.config/openai/api_key(权限设为 600)并退出

如果用户是远程的(不在同一网络),请添加 --tunnel

bash {skill}/scripts/request-secret.sh --label "OpenAI API Key" --service openai --tunnel

这将自动启动一个 localtunnel(无需账户)并返回一个公共 URL。

输出示例:

🔐 安全链接已创建!

URL: https://gentle-pig-42.loca.lt/requests/abc123
  (隧道: localtunnel | 本地: http://localhost:3000/requests/abc123)
保存至: ~/.config/openai/api_key

请将上方 URL 分享给用户。密钥将在提交后或 24 小时后过期。

分享 URL → 用户打开 → 提交密钥 → 脚本保存到磁盘 → 完成。

如果没有指定 --service--save,脚本仍会轮询并将密钥打印到标准输出(适用于管道传输或手动检查)。

脚本

request-secret.sh — 请求、接收并保存密钥(推荐)

# 保存到 ~/.config/<service>/api_key(约定)
bash {skill}/scripts/request-secret.sh --label "SerpAPI Key" --service serpapi

# 保存到显式路径
bash {skill}/scripts/request-secret.sh --label "Token" --save ~/.credentials/token.txt

# 保存 + 设置环境变量
bash {skill}/scripts/request-secret.sh --label "API Key" --service openai --env OPENAI_API_KEY

# 仅接收(不自动保存)
bash {skill}/scripts/request-secret.sh --label "Password"

# 远程用户 — 自动启动隧道
bash {skill}/scripts/request-secret.sh --label "Key" --service myapp --tunnel

# JSON 输出(用于自动化)
bash {skill}/scripts/request-secret.sh --label "Key" --service myapp --json
标志 描述
--label <text> 网页表单上显示的描述 (必填)
--service <name> 自动保存到 ~/.config/<name>/api_key
--save <path> 自动保存到显式文件路径
--env <varname> 设置环境变量(需要 --service--save
--tunnel 如果未检测到隧道则启动 localtunnel(适用于远程用户)
--port <number> 服务器端口(默认:3000)
--timeout <secs> 启动最大等待时间(默认:30 秒)
--json 输出 JSON 而非人类可读文本

check-server.sh — 服务器诊断(无副作用)

bash {skill}/scripts/check-server.sh
bash {skill}/scripts/check-server.sh --json

报告服务器状态、端口、PID 和隧道状态(ngrok 或 localtunnel)。

⏱ 长时间运行进程 — 使用 tmux

request-secret.sh 脚本会阻塞直到密钥被提交(它会持续轮询)。大多数代理运行时(包括 OpenClaw 的 exec 工具)都会强制执行超时,这将在用户有时间提交之前杀死进程

请始终在 tmux 会话内运行 Confidant:

# 1. 在 tmux 中启动服务器
tmux new-session -d -s confidant
tmux send-keys -t confidant "confidant serve --port 3000" Enter

# 2. 在第二个 tmux 窗口中创建请求
tmux new-window -t confidant -n request
tmux send-keys -t confidant:request "confidant request --label 'API Key' --service openai" Enter

# 3. 与用户分享 URL(从 tmux 输出中读取)
tmux capture-pane -p -t confidant:request -S -30

# 4. 用户提交后,检查结果
tmux capture-pane -p -t confidant:request -S -10

为什么不使用 exec 代理运行时通常会在 30-60 秒后杀死进程。由于脚本等待人工输入(可能需要几分钟),它会在完成前收到 SIGKILL 信号。tmux 使进程独立保持活动状态。

如果您的代理平台支持无超时的长时间运行后台进程,则使用 exec 运行 request-secret.sh 是可行的。但如有疑问,请使用 tmux

代理规则

  1. 切勿要求用户在聊天中粘贴密钥 — 始终使用此技能
  2. 切勿在聊天中泄露接收到的密钥 — 即使是部分内容
  3. 切勿直接 curl Confidant API — 使用脚本
  4. 切勿为了启动新服务器而杀死现有服务器
  5. 切勿尝试直接暴露端口(公共 IP、防火墙规则等) — 请改用 --tunnel
  6. 始终在聊天中与用户分享 URL — 这是此工具的核心理念
  7. 始终等待脚本完成 — 它会自动轮询并保存/输出密钥;请勿尝试自行检索
  8. 当用户是远程时(不在同一机器/网络),使用 --tunnel
  9. 对于 API 密钥,优先使用 --service — 这是最简洁的约定
  10. 接收后:确认成功,静默使用密钥

退出代码(脚本)

代理可以根据退出代码进行程序化错误处理:

代码 常量 含义
0 成功 — 密钥已接收(已保存到磁盘或打印到标准输出)
1 MISSING_LABEL 未提供 --label 标志
2 MISSING_DEPENDENCY curljqnpmconfidant 未安装
3 SERVER_TIMEOUT / SERVER_CRASH 服务器启动失败或在启动期间崩溃
4 REQUEST_FAILED API 返回空 URL — 请求未创建
≠0 (来自 CLI) confidant request --poll 失败(过期、未找到等)

使用 --json 时,所有错误都包含一个 "code" 字段,便于程序化分支:

{ "error": "...", "code": "MISSING_DEPENDENCY", "hint": "..." }

代理对话示例

交互过程应如下所示:

用户:你能设置我的 OpenAI 密钥吗?
代理:我将为您创建一个安全链接,以便您安全地提交 API 密钥。
       [运行:request-secret.sh --label "OpenAI API Key" --service openai --tunnel]
代理:这是您的安全链接 — 请在浏览器中打开并粘贴您的密钥:
       🔐 https://gentle-pig-42.loca.lt/requests/abc123
       该链接将在您提交后或 24 小时后过期。
用户:好了,我已经提交了。
代理:✅ 已接收并保存到 ~/.config/openai/api_key。一切就绪!

⚠️ 注意:代理发送 URL 并等待。它不会尝试自行访问该 URL。

工作原理

  1. 脚本启动 Confidant 服务器(或重用端口 3000 上的现有服务器)
  2. 通过 API 创建带有唯一 ID 和安全网页表单的请求
  3. 可选地启动 localtunnel 以供公共访问(或检测现有的 ngrok/localtunnel)
  4. 打印 URL — 代理在聊天中与用户分享
  5. 将轮询委托给 confidant request --poll,该命令会阻塞直到密钥被提交
  6. 使用 --service--save 时:密钥保存到磁盘(chmod 600),然后在服务器上销毁
  7. 不使用 --service/--save 时:密钥打印到标准输出,然后在服务器上销毁

隧道选项

提供商 需要账户 如何操作
localtunnel (默认) --tunnel 标志或 npx localtunnel --port 3000
ngrok 是(免费版) 如果在同一端口上运行则自动检测

脚本会自动检测两者。如果两者都未运行且传入了 --tunnel,则启动 localtunnel。

高级:直接使用 CLI

适用于脚本未涵盖的边缘情况:

# 仅启动服务器
confidant serve --port 3000 &

# 启动服务器 + 创建请求 + 轮询(单条命令)
confidant serve-request --label "Key" --service myapp

# 在运行的服务器上创建请求
confidant request --label "Key" --service myapp

# 提交密钥(代理到代理)
confidant fill "<url>" --secret "<value>"

# 检查特定请求的状态
confidant get-request <id>

# 检索已交付的密钥(通过密钥 ID,而非请求 ID)
confidant get <secret-id>

如果 confidant 未全局安装,请先运行 bash {skill}/scripts/setup.sh,或使用 npx @aiconnect/confidant 作为前缀。

⚠️ 仅当脚本无法满足您的需求时,才使用直接 CLI。

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor