---
name: allinai-standalone-setup
description: 在当前客户端独立安装 all in AI 生图和社媒助手两个 Skill，并复用用户自己的本站 Key。用于只安装工具技能、保留现有模型和登录配置的请求。
---

# 安装两个独立 Skill

为当前正在使用的客户端安装 `allinai-image` 和 `allinai-social`。本入口只指导安装；实际安装的是下面两个 Skill，不需要把本入口装成第三个 Skill。用户已明确只要其中一个时按其范围执行。

保持当前客户端的聊天模型、模型供应商、登录方式和认证文件不变。不安装 Codex、其他客户端或额外的命令行工具；不调用旧的根路径 `/SKILL.md`、旧 `setup.mjs` 或 Codex 接入流程。这两个 Skill 使用用户自己的本站 API Key 调用工具接口，模型聊天仍由当前客户端原有配置提供。

## 固定下载地址

本入口：`https://api.muskloveai.com/skills/standalone/SKILL.md`。

| Skill | 指令文件 | 导入包 |
|---|---|---|
| 生图与改图 `allinai-image` | [SKILL.md](https://api.muskloveai.com/skills/standalone/allinai-image/SKILL.md) | [ZIP](https://api.muskloveai.com/skills/standalone/downloads/allinai-image-portable-20261101.1.zip) |
| 社媒助手 `allinai-social` | [SKILL.md](https://api.muskloveai.com/skills/standalone/allinai-social/SKILL.md) | [ZIP](https://api.muskloveai.com/skills/standalone/downloads/allinai-social-portable-20261101.1.zip) |

下载这些公开文件不需要 API Key。它们是指令文档，不是安装脚本；无需执行 npm、npx 或下载的可执行程序。

安装前读取 `https://api.muskloveai.com/skills/standalone/manifest.json`，核对 `version` 与 `skills` 中这两个名称。每项 `document`、`download` 是相对于本站的公开路径；对应的 `sha256`、`download_sha256` 分别校验指令文件和 ZIP 的原始字节，不能对重新排版后的文本计算校验值。下载地址必须保持上述本站域名和独立专区路径，不发送凭据。校验不一致时停止安装该项，重新读取清单及文件；仍不一致则报告问题，不执行下载内容。没有校验能力时明确标记未核验，提供手动下载导入指引，不宣称已校验或自动安装成功。

## 确认当前客户端的安装方式

1. 根据宿主明确提供的客户端信息、技能管理工具或安装文档确认当前客户端及其 Skill 导入机制。优先使用宿主提供的安装／导入功能。
2. 只有在宿主说明、实际配置或已验证的技能列表能确认某目录会被当前客户端读取时，才使用目录安装。不要根据产品名猜测目录，尤其不能猜 WorkBuddy 的路径，也不能把其他客户端的技能目录当成当前客户端目录。
3. 有已验证目录时，将两个指令文件分别安装为 `<技能目录>/allinai-image/SKILL.md` 和 `<技能目录>/allinai-social/SKILL.md`。安装前读取下载内容，核对 YAML 中的 `name` 与上述名称一致，确保文件是 Markdown 而不是下载错误页。
4. 客户端提供 ZIP 导入时使用上表对应的导入包；若需要自行解压，先检查归档内容和目标路径，拒绝绝对路径、向上跳转路径或链接指向目标目录外的条目。只安装这两个 Skill 的内容，不执行归档内程序。

如果不能确认安装机制，或当前宿主没有安装／写文件能力，停止自动安装，给出上表两个 ZIP 的下载链接，请用户通过当前客户端已提供的 Skill 导入功能导入。若客户端也没有可确认的导入功能，明确说明尚不能确认该客户端支持安装；不要编造菜单或路径，不要声称安装完成。

## 保护现有 Skill

只处理本次两个同名 Skill，不清空技能目录，不改动其他 Skill。已存在相同内容时无需重复安装。

更新同名 Skill 前，保存完整、可恢复的原文件或原目录备份，并记录原位置与备份位置；备份应放在已确认不会被客户端作为技能重复加载的位置。无法安全备份时不要覆盖。目录安装仅更新本次指令文件，保留其他用户文件；客户端导入可能替换整个包时，先确认已备份原包。不要用一个空目录或新包覆盖用户的其他技能。

## 一次配置用户自己的 Key

- 优先复用宿主已授权用于本站的密钥设置，或当前执行环境的 `ALLINAI_API_KEY`；仅检查是否可用，不打印密钥值，不枚举无关环境变量。
- 两个 Skill 可以共用同一枚具备“图像生成”和“社媒数据”权限的本站通用 Key；视频专用 Key 不适用。没有某项权限时如实说明，不自动创建、更换 Key 或调整分组。
- 缺少凭据时，引导用户在当前客户端的安全密钥设置中填写一次，或通过本机隐藏输入配置当前客户端执行工具可以读取的 `ALLINAI_API_KEY`。不要让用户把 Key 发进聊天，不把 Key 放进命令参数、Skill 文件、普通任务记录或日志，也不要扫描其他客户端的 `auth.json` 等认证文件。
- 持久保存优先使用用户已明确授权的宿主安全凭据存储。没有安全输入或存储能力时，交付本机配置指引并标记凭据待配置，不自行写入普通明文配置文件；用户明确选择持久环境变量方案时，按下文说明其作用范围和存储性质。
- 环境变量只在某个终端设置，不代表已运行的桌面客户端会继承。核对实际执行工具是否能读取；需要重新打开客户端时明确提示，不为解决继承问题修改其模型或登录配置。

### Windows 凭据与编码

本流程不需要生成 `.ps1`、`.allinai_env` 或 dotenv 文件。不要另造凭据文件让客户端“自动读取”：只有宿主明确支持的存储和加载机制才有效。优先使用其密钥设置。

若必须通过 PowerShell 执行检查，先确认实际执行工具的 `$PSVersionTable.PSVersion`。Windows PowerShell 5.1 会按系统默认编码解释无 BOM 的脚本；含中文的 `.ps1` 应明确保存为 UTF-8 BOM，或使用下面的纯 ASCII 检查代码。PowerShell 7 的默认编码不同，不能把一种写法直接套到所有版本。

脚本编码与凭据数据编码是两件事。处理用户已授权、宿主本来就支持的文本凭据文件时，按该格式规定读写；需要 UTF-8 无 BOM 时使用显式的 `UTF8Encoding(false)`。读取已有文件时处理文件开头的 BOM 和行尾，匹配精确变量名 `ALLINAI_API_KEY`，不把 BOM 并入名称或值。不要把 dotenv 当 PowerShell 代码执行，也不要打印其内容。发现旧文件异常应在本机修复读取或编码，不另存更多 Key 副本。

写入用户级环境变量（`HKCU\Environment`）不等于当前进程已拿到 Key，也不是加密凭据库；不自动把它当安全存储兜底。只有用户明确选择持久环境变量方案后才写入，并说明其本机明文性质。子进程通常继承父进程的环境；桌面程序重启后，启动器仍可能保留旧环境，宿主也可能过滤变量。因此“已写入”“已重启”都不能代替下面的实际执行检查。不要为传递 Key 而关闭沙箱或提高进程权限。

## 只做免费安装检查

有凭据和 HTTP 能力时，可在当前客户端实际使用的执行环境内读取 Key，通过以下接口核对权限：

- `GET https://api.muskloveai.com/v1/models`：检查 `data[].id` 是否包含所需图片模型。当前文档覆盖 `gpt-image-2`、`gpt-image-2.5`、`gpt-image-2.5-flare`、`gpt-image-2.5-sunburst`，以该 Key 的实际目录为准。
- `GET https://api.muskloveai.com/v1/social-data/catalog`：检查是否成功返回 `data.entries` 及可用功能。

先在**实际发起 API 请求的工具进程**读取凭据，仅报告是否存在且非空。缺失时停止，不发送空的或带 `undefined` 的认证头；不要用另一个终端的检查代替宿主工具检查。请求使用运行时读取的 `Authorization: Bearer <本站 Key>`，认证请求不跟随重定向，不把 Key 发往其他域名。以上是免费的目录检查，不发送图片生成／编辑请求或社媒收费查询；不得为证明安装成功而使用客户余额。

使用环境变量的 PowerShell 宿主可直接执行下面的纯 ASCII 只读检查；它兼容 Windows PowerShell 5.1 和 PowerShell 7，无需安装依赖。使用宿主密钥设置时，按其已验证接口读取密钥，保持同样的检查逻辑，不把密钥值嵌入脚本。输出不含 Key 或完整响应。

```powershell
$allinaiKey = [Environment]::GetEnvironmentVariable('ALLINAI_API_KEY', 'Process')
if ([string]::IsNullOrWhiteSpace($allinaiKey)) {
    [pscustomobject]@{ keyPresent = $false; status = 'key_missing' } | ConvertTo-Json -Compress
    return
}
if ($allinaiKey -match '[\s\uFEFF]' -or $allinaiKey -in @('undefined', 'null', 'YOUR_API_KEY', '<API_KEY>')) {
    [pscustomobject]@{ keyPresent = $true; status = 'key_format_error' } | ConvertTo-Json -Compress
    $allinaiKey = $null
    return
}
$allinaiHeaders = @{ Authorization = 'Bearer ' + $allinaiKey }
$allinaiModels = @('gpt-image-2', 'gpt-image-2.5', 'gpt-image-2.5-flare', 'gpt-image-2.5-sunburst')
try {
    foreach ($allinaiKind in @('image', 'social')) {
        $allinaiPath = if ($allinaiKind -eq 'image') { '/models' } else { '/social-data/catalog' }
        try {
            $allinaiData = Invoke-RestMethod -Method Get -Uri ('https://api.muskloveai.com/v1' + $allinaiPath) -Headers $allinaiHeaders -MaximumRedirection 0 -TimeoutSec 20 -ErrorAction Stop
            $allinaiCount = if ($allinaiKind -eq 'image') {
                @($allinaiData.data | Where-Object { $_.id -in $allinaiModels }).Count
            } else {
                @($allinaiData.data.entries | Where-Object { $_.action -and $_.price.currency -eq 'CNY' -and $null -ne $_.price.amount }).Count
            }
            [pscustomobject]@{ keyPresent = $true; capability = $allinaiKind; httpStatus = 200; permissionVerified = ($allinaiCount -gt 0); availableCount = $allinaiCount } | ConvertTo-Json -Compress
        } catch {
            $allinaiStatus = if ($null -ne $_.Exception.Response) { [int]$_.Exception.Response.StatusCode } else { 0 }
            [pscustomobject]@{ keyPresent = $true; capability = $allinaiKind; httpStatus = $allinaiStatus; permissionVerified = $false } | ConvertTo-Json -Compress
        }
    }
} finally {
    $allinaiKey = $null
    $allinaiHeaders = $null
}
```

解释结果时遵循以下规则：

- `key_missing`／`key_format_error`：凭据未进入工具进程或格式异常，尚未发请求，先处理本机配置。
- 401：鉴权失败，可能是无效、失效的 Key 或认证头问题；仅凭状态码不能断言 Key 没传或 Key 本身没问题。核对本机来源和服务端错误码，禁止输出认证头。
- 403：访问被拒绝，结合返回的错误码核对 Key 的权限／策略；不要当成网络故障重试。
- HTTP 200 但 `permissionVerified: false`：目录为空、结构不符或没有目标功能，不能宣布该能力可用。两项权限分别报告。
- 无可读 HTTP 状态（检查示例中的 0，可能是网络错误或被阻止的重定向）、超时或 5xx：检查未通过，不以重写 Key 作为修复办法。示例只输出状态；进一步诊断只提取脱敏的错误码和请求编号，不回显完整异常对象或请求头。

上述检查成功只证明当前工具环境的鉴权和目录权限通过，不证明已完成付费生成，也不保证重启后的凭据仍在。若用户要求长期配置，首次重新打开客户端后还需在该客户端工具环境复查；宿主没有可用的 HTTP／执行能力时标记待验证，不让用户反复重装 Skill。

## 完成时分别报告

用简短中文逐项说明以下状态，依据实际证据填写，不把其中一项当成另一项已经完成：

1. **文件安装**：两项分别是否安装、实际目标位置或客户端导入结果，以及旧版备份位置。
2. **凭据与权限**：实际工具进程是否读到 Key；两个免费目录各自的 HTTP 状态及权限结果。仅有文件哈希、环境变量保存成功或“重启即可”的判断不能写成验证通过。不要输出 Key。
3. **客户端加载**：只有当前客户端的技能列表、导入确认或新会话确实识别这两个 Skill 时，才写“已加载”。仅写入文件时说明需重新加载／新建会话，并标记尚未验证。
4. **真实付费验收**：本安装流程未生成图片、未查询收费社媒数据，真实调用尚未验收。之后用户发起生图或查询时，按对应 Skill 的授权、预算和未知结果处理规则执行。

提醒用户之后可以直接提出“画一张图片”或“查询某平台某品牌的公开反馈”。实际执行仍需要当前宿主具备 HTTP 或本地执行能力，并允许读取凭据和保存必要结果；纯文档安装无法替宿主增加这些工具权限。缺少能力时说明具体缺项，不伪称工具已可用。
