Deep Link 导入
Clash for AI 支持桌面端 deep link 导入流程。
第三方网页可以通过如下链接唤起桌面应用:
clash-for-ai://v1/import?resource=provider&payload=BASE64URL_JSON桌面应用会:
- 打开应用或把已有窗口拉到前台
- 解析导入请求
- 弹出导入确认弹窗
- 只有在用户确认后才真正导入
当前最小支持范围只有:
providermodel
如果你想直接使用现成的生成器页面,可以打开:
URL 格式
Section titled “URL 格式”请使用下面的结构:
clash-for-ai://v1/import?resource=<provider|model>&payload=<base64url-json>规则:
resource只能是provider或modelpayload必须是 base64url 编码后的 JSON 对象- 如果路由不支持、payload 非法或缺少必填字段,应用会拒绝导入
本地验证方式
Section titled “本地验证方式”如果你想在自己的机器上验证这条链路,建议使用打包后的桌面应用,而不是只依赖 pnpm dev。
原因:
- 浏览器点击
clash-for-ai://...时,实际是让操作系统去打开这个协议 - 操作系统必须先知道哪个应用负责处理这个 scheme
- 打包后的桌面应用会更稳定地声明这个协议处理器
- 仅靠开发态进程,浏览器通常无法稳定识别这个协议
推荐验证步骤:
- 先构建一个本地打包版桌面应用
- 至少启动一次这个打包后的应用
- 打开 /deeplink.html
- 点击
Open Deep Link - 确认 Clash for AI 被唤起,并出现导入确认弹窗
如果浏览器提示这个 scheme 没有注册 handler,最常见的原因就是打包后的应用还没有安装或至少启动过一次。
Provider payload
Section titled “Provider payload”支持字段:
{ "name": "OpenRouter", "baseUrl": "https://openrouter.ai/api/v1", "apiKey": "sk-or-example"}说明:
name、baseUrl、apiKey为必填- 这里的公开 payload 设计刻意与当前桌面端手动添加 Provider 的表单字段保持一致
- 对第三方接入方来说,最小导入流程不需要额外提供
authMode - Clash for AI 当前会按现有添加表单的默认 bearer 行为处理这类导入
示例 deep link:
clash-for-ai://v1/import?resource=provider&payload=eyJuYW1lIjoiT3BlblJvdXRlciIsImJhc2VVcmwiOiJodHRwczovL29wZW5yb3V0ZXIuYWkvYXBpL3YxIiwiYXBpS2V5Ijoic2stb3ItZXhhbXBsZSJ9Model payload
Section titled “Model payload”支持字段:
{ "name": "Relay Models", "baseUrl": "https://relay.example.com/v1", "apiKey": "sk-model-example", "providerType": "openai-compatible", "modelIds": ["gpt-4o-mini", "claude-3-7-sonnet"]}说明:
name、baseUrl、apiKey以及至少一个模型 ID 为必填providerType为可选- 支持的
providerType值:openai-compatibleanthropic-compatible - 如果不传
providerType,Clash for AI 默认按openai-compatible处理 modelIds中第一个模型会作为默认模型 ID
示例 deep link:
clash-for-ai://v1/import?resource=model&payload=eyJuYW1lIjoiUmVsYXkgTW9kZWxzIiwiYmFzZVVybCI6Imh0dHBzOi8vcmVsYXkuZXhhbXBsZS5jb20vdjEiLCJhcGlLZXkiOiJzay1tb2RlbC1leGFtcGxlIiwicHJvdmlkZXJUeXBlIjoib3BlbmFpLWNvbXBhdGlibGUiLCJtb2RlbElkcyI6WyJncHQtNG8tbWluaSIsImNsYXVkZS0zLTctc29ubmV0Il19如何生成 payload
Section titled “如何生成 payload”payload 的规则是:
- 先准备 JSON 对象
- 按 UTF-8 编码
- 再做 base64url 编码
base64url 的规则:
- 把
+替换成- - 把
/替换成_ - 去掉末尾的
=
JavaScript 示例:
function toBase64Url(value) { return btoa(JSON.stringify(value)) .replace(/\+/g, "-") .replace(/\//g, "_") .replace(/=+$/g, "");}
const payload = toBase64Url({ name: "OpenRouter", baseUrl: "https://openrouter.ai/api/v1", apiKey: "sk-or-example"});
const url = `clash-for-ai://v1/import?resource=provider&payload=${payload}`;用户体验流程
Section titled “用户体验流程”当用户点击 deep link 后:
- 系统询问是否打开 Clash for AI
- Clash for AI 被唤起
- 应用展示导入确认弹窗
- 用户选择确认或取消
- 只有确认后才真正写入配置
不要把这套流程当作静默导入。
建议:
- 默认保留用户确认步骤
- 不要公开传播包含真实 API Key 的链接
- 尽量使用短期链接或用户主动生成的链接
- 发送方也应对
baseUrl和 payload 字段做基础校验
当前最小实现还不支持:
provider + models组合导入- 签名 payload
- 通过 token 拉取远程配置
- 自动覆盖或合并现有配置