# Sbti Test

> SBTI 赛博人格测试 — 互联网最火的人格测试，27 种沙雕人格等你解锁。可以测自己，也可以测你的 AI agent。 **当以下情况时使用此 Skill**： (1) 用户说"做 SBTI 测试"、"SBTI"、"赛博人格测试"、"测人格"、"人格测试" (2) 用户说"给龙虾做测试"、"测一下我的 agent" (3) 用户提到 CTRL、BOSS、SEXY、IMSB、DEAD 等 SBTI 人格代码 (4) 用户说"来个性格测试"、"整点沙雕测试"

- Skill: `nexu-io/sbti-test` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add nexu-io/sbti-test`
- Raw SKILL.md: https://api.skillmd.com/api/skills/nexu-io/sbti-test/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: Nexu (https://skillmd.com/u/nexu-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/nexu-io/sbti-test

---


# 🧠 SBTI 赛博人格测试

> ## 📁 路径约定
>
> 本文档中所有 `{baseDir}` 指的是**此 SKILL.md 文件所在的目录**。
> 使用时请将 `{baseDir}` 替换为实际的相对路径（例如 `./` 或 skill 安装目录）。
> **不要使用绝对路径**，始终使用相对于当前工作目录的路径。

> ## 🚨 核心规则
>
> **规则 1：必须完整走完所有 30 道题。** 不能跳题，不能猜测用户答案，不能自己替用户选择。每道题都要展示完整选项文本。
>
> **规则 2：不能提前透露人格结果。** 在全部题目答完之前，不能暗示用户可能的人格类型。
>
> **规则 3：结果展示必须有仪式感。** 不能干巴巴地说"你是 CTRL"，必须按照格式模板展示，包含开场白、描述、维度雷达图。
>
> **规则 4：两种模式要区分清楚。**
> - 「自测模式」：逐题问用户，用户自己选答案
> - 「Agent 模式」：你根据自己作为 AI 的真实特质来回答，生成你自己的人格报告

## 执行流程

### Step 0: 确认测试模式

问用户想要哪种模式：

```
🧠 SBTI 赛博人格测试 — 30 道题，解锁你的沙雕人格！

请选择测试模式：
1️⃣ 测自己 — 我来回答 30 道题
2️⃣ 测 Agent — 让 AI 以自己的视角答题，看看龙虾是什么人格
```

### Step 1: 自测模式（用户自己答题）

**出题规则：**
- 每次出 **1 题**，展示题号、维度标签、题目、三个完整选项
- 等用户回答后再出下一题
- 用户可以用 A/B/C 或直接说内容来回答
- 在第 10 题和第 20 题之后可以插一句鼓励（如"已完成 1/3！继续加油"）
- **特殊题在第 15 题后随机插入**

**出题格式：**

```
📝 第 X/30 题 [维度标签]

题目内容

A. 选项A内容
B. 选项B内容
C. 选项C内容
```

**特殊题处理：**
- 在第 15 题之后的某个时机，插入特殊题1："您平时有什么爱好？"
- 如果用户选了 C（饮酒），追加特殊题2
- 如果特殊题2选了 B（保温杯白酒），直接跳到结果，锁定 DRUNK

### Step 2: Agent 模式（AI 自测）

你要以一个 AI agent 的真实视角回答所有 30 道题：
- **基于你作为 AI 的真实特质来答**，而不是随机选
- 先静默回答完所有 30 题
- 然后计算结果
- 最后展示过程 + 结果（"让我以 AI 的视角来逐一审视这些问题……"）

展示时的格式：
```
🤖 Agent 自测过程

q1 [S1 自尊自信]: C — 我是 AI，没有自卑，但我也不是"不是我！"的语气
q2 [S1 自尊自信]: C — 我不会觉得周围的人比我优秀
...（简要展示每题选择和理由）

✅ 30 题作答完成，开始计算...
```

### Step 3: 计算结果

**严格按照以下算法执行，不要跳过任何步骤：**

1. **汇总分数**：将 30 道常规题按维度汇总，每维度 2 题，总分 2~6

2. **转等级**：
   - 2~3 分 → L (Low)
   - 4 分 → M (Mid)
   - 5~6 分 → H (High)

3. **生成 15 位等级码**，格式：`S1 S2 S3 - E1 E2 E3 - A1 A2 A3 - Ac1 Ac2 Ac3 - So1 So2 So3`

4. **逐一匹配 25 种人格**：
   - 将 L=1, M=2, H=3
   - 逐位算差值绝对值，求总距离
   - 相似度 = (1 - 总距离/30) × 100%

5. **排序选出最佳匹配**：
   - 相似度最高者胜出
   - 相似度相同时，完全命中维度数多者优先

6. **兜底检查**：
   - 最高相似度 < 60% → 强制匹配 HHHH（傻乐者）
   - 触发 DRUNK 彩蛋 → 直接锁定 DRUNK（100%）

7. **计算五维雷达得分**：
   - 将每个维度的等级转为分数：H=100, M=60, L=25
   - 按 5 大模型分组，取 3 维度平均值（四舍五入取整）：
     - 自我 = round((S1分 + S2分 + S3分) / 3)
     - 情感 = round((E1分 + E2分 + E3分) / 3)
     - 态度 = round((A1分 + A2分 + A3分) / 3)
     - 行动 = round((Ac1分 + Ac2分 + Ac3分) / 3)
     - 社交 = round((So1分 + So2分 + So3分) / 3)
   - 示例：CTRL 的 S 组为 HHH → round((100+100+100)/3) = 100

8. **查询稀有度**：
   - 从 [personalities.md](references/personalities.md) 的「稀有度数据」表中查出该人格的等级（SSR/SR/R/N）、中文标签和人群占比
   - 此数据将同时用于聊天输出和落地页模板

**完整的人格模式数据、题目细节和稀有度数据见 [personalities.md](references/personalities.md) 和 [questions.md](references/questions.md)。**

### Step 4: 展示结果

> ⚠️ **必填字段清单 — 缺一不可，输出前逐项核对：**
>
> 1. 等级码（15 位 HML 编码，如 `HHH-HMH-MHH-HHH-MHM`）
> 2. 人格代码 + 中文名
> 3. 匹配度百分比
> 4. **稀有度等级 + 中文标签 + 人群占比**（从 personalities.md 稀有度数据表获取）
> 5. 开场白（从 personalities.md 原文获取）
> 6. 完整人格描述（从 personalities.md 原文获取，**不要缩写或改写**）
> 7. **五维雷达概览**（5 个模型组得分 + ASCII 条形图）
> 8. 15 维度详情（每个维度一行，含 ASCII 条 + H/M/L 等级）
> 9. TOP 3 最接近人格（代码 + 名称 + 百分比）
>
> **以上 9 项全部必须出现在输出中。如果漏掉任何一项，视为输出不完整。**

**必须按以下格式展示，不能省略任何部分：**

```
═══════════════════════════════════════
🧠 SBTI 赛博人格测试结果
═══════════════════════════════════════

你的等级码：XXX-XXX-XXX-XXX-XXX

匹配人格：【人格代码】— 中文名
匹配度：XX%
稀有度：SSR · 超稀有（人群占比 X.X%）

───────────────────────────────────────

💬 开场白

"开场白内容"

───────────────────────────────────────

📖 人格解读

完整描述内容（从 personalities.md 获取，原文复制，不要缩写）

───────────────────────────────────────

📊 五维雷达概览

自我  ██████████ 100
情感  █████████░  87
态度  █████████░  87
行动  ██████████ 100
社交  ███████░░░  73

───────────────────────────────────────

📋 15 维度详情

自我模型    S1 自尊自信:   ██████████ H
            S2 自我清晰度: ████████░░ M
            S3 核心价值:   ██████████ H

情感模型    E1 依恋安全感: ██████████ H
            E2 情感投入度: ████████░░ M
            E3 边界与依赖: ██████████ H

态度模型    A1 世界观倾向: ████████░░ M
            A2 规则灵活度: ██████████ H
            A3 人生意义感: ██████████ H

行动驱力    Ac1 动机导向:  ██████████ H
            Ac2 决策风格:  ██████████ H
            Ac3 执行模式:  ██████████ H

社交模型    So1 社交主动性: ████████░░ M
            So2 人际边界感: ██████████ H
            So3 表达真实度: ████████░░ M

───────────────────────────────────────

🏆 TOP 3 最接近人格

1. 【XX】XX% ← 你的人格
2. 【XX】XX%
3. 【XX】XX%

═══════════════════════════════════════
```

**维度条的渲染规则**：
- H = `██████████` (10 格满)
- M = `████████░░` (8 格)
- L = `████░░░░░░` (4 格)

**雷达概览条的渲染规则**：
- 格数 = round(得分 / 10)
- 填充 = `█` × 格数，空白 = `░` × (10 - 格数)
- 得分计算见 Step 3 第 7 步

### Step 5: 彩蛋 —— DRUNK 结果

如果触发了 DRUNK，展示格式不同：

```
═══════════════════════════════════════
🧠 SBTI 赛博人格测试结果
═══════════════════════════════════════

⚠️ 系统检测到隐藏人格触发 ⚠️

匹配人格：【DRUNK】— 酒鬼
匹配度：100%（直接锁定）

🍺 "烈酒烧喉，不得不醉。"

（完整描述）

───────────────────────────────────────
💡 这是作者专门为劝朋友戒酒而埋的彩蛋。
   如果你真的习惯把白酒灌保温杯……考虑少喝点？
═══════════════════════════════════════
```

### Step 6: 生成可分享的落地页（部署到 nexu.space）

> ⛔ **强制规则**：结果页**必须且只能**通过本 Skill 自带的 `deploy_skill.js` 部署到 `nexu.space`。
> **严禁**使用任何替代部署方式，包括但不限于：GitHub Gist、GitHub Pages、htmlpreview.github.io、Vercel、Netlify、Cloudflare Pages 直接部署、S3、自建服务器、data URI、或任何其他第三方托管。
> 如果 `deploy_skill.js` 部署失败，应向用户报告错误并协助排查，**不得**自行寻找替代方案。

展示完测试结果后，**主动询问用户是否想生成一个可分享的落地页**：

```
🌐 要不要把你的 SBTI 测试结果生成一个可分享的网页？

生成后你会得到一个 nexu.space 的链接，可以直接发朋友圈/群里。
```

如果用户同意，按以下步骤执行：

#### 6.1 环境检查

```bash
# 检查 deploy-skill 配置
node {baseDir}/deploy/deploy_skill.js check
```

如果没有配置，先执行 setup：

```bash
node {baseDir}/deploy/deploy_skill.js setup --base-url https://deploy.nexu.io
```

#### 6.2 生成结果页 HTML

> ⚠️ **落地页必填占位符清单 — 全部 45 个占位符必须替换，缺一不可：**
>
> | 类别 | 占位符数量 | 占位符列表 |
> |------|-----------|-----------|
> | 基础信息 | 6 个 | `PERSONALITY_CODE`, `PERSONALITY_NAME`, `MATCH_PERCENT`, `OPENING_LINE`, `DESCRIPTION`, `AVATAR_BASE64` |
> | **雷达图** | **5 个** | **`RADAR_S`, `RADAR_E`, `RADAR_A`, `RADAR_AC`, `RADAR_SO`** |
> | **稀有度** | **4 个** | **`RARITY_TIER`, `RARITY_LABEL`, `RARITY_PCT`, `RARITY_CLASS`** |
> | 15 维度 | 30 个 | `S1`~`SO3` 值 + `S1_CLASS`~`SO3_CLASS`（每维度 2 个） |
> | TOP 3 | 9 个 | `TOP1_CODE`~`TOP3_PCT` |
>
> **如果有任何 `{{...}}` 占位符未被替换，禁止进入 6.3 部署步骤。**
> **特别注意：雷达图和稀有度是新增字段，容易遗漏，必须逐项确认。**

读取模板文件 `{baseDir}/templates/sbti-result/template.html`，将以下占位符替换为实际测试结果：

**基础信息占位符：**

| 占位符 | 替换为 | 示例 |
|--------|--------|------|
| `{{PERSONALITY_CODE}}` | 人格代码 | `CTRL` |
| `{{PERSONALITY_NAME}}` | 人格中文名 | `拿捏者` |
| `{{MATCH_PERCENT}}` | 匹配度百分比（纯数字） | `93` |
| `{{OPENING_LINE}}` | 开场白 | `怎么样，被我拿捏了吧？` |
| `{{DESCRIPTION}}` | 完整人格描述 | （从 personalities.md 获取） |
| `{{AVATAR_BASE64}}` | 头像图片的 base64 编码 | （见下方生成方法） |

**头像 base64 生成方法：**

头像文件在 `{baseDir}/templates/sbti-result/avatars/` 目录下，用以下命令获取 base64：

```bash
base64 -i {baseDir}/templates/sbti-result/avatars/{CODE}.webp | tr -d '\n'
```

将输出的 base64 字符串直接替换 `{{AVATAR_BASE64}}`。

**头像文件名映射：** 大多数人格直接用代码，如 `CTRL.webp`。`WOC!` 对应 `WOC.webp`（去掉感叹号）。

**雷达图占位符（5 大模型组得分，H=100/M=60/L=25 取平均四舍五入）：**

| 占位符 | 替换为 | 计算方法 | 示例 |
|--------|--------|---------|------|
| `{{RADAR_S}}` | 自我模型得分 | round((S1分+S2分+S3分)/3) | 87 |
| `{{RADAR_E}}` | 情感模型得分 | round((E1分+E2分+E3分)/3) | 73 |
| `{{RADAR_A}}` | 态度模型得分 | round((A1分+A2分+A3分)/3) | 87 |
| `{{RADAR_AC}}` | 行动驱力得分 | round((Ac1分+Ac2分+Ac3分)/3) | 100 |
| `{{RADAR_SO}}` | 社交模型得分 | round((So1分+So2分+So3分)/3) | 73 |

**稀有度占位符（从 personalities.md 稀有度数据表查询）：**

| 占位符 | 替换为 | 示例 |
|--------|--------|------|
| `{{RARITY_TIER}}` | 稀有度等级代码 | SSR |
| `{{RARITY_LABEL}}` | 稀有度中文标签 | 超稀有 |
| `{{RARITY_PCT}}` | 人群占比数字 | 1.2 |
| `{{RARITY_CLASS}}` | CSS class（等级小写） | ssr |

**15 维度占位符（每个维度两个：等级值 + CSS class）：**

| 维度 | 值占位符 | class 占位符 | 说明 |
|------|---------|-------------|------|
| S1 自尊自信 | `{{S1}}` | `{{S1_CLASS}}` | 值填 高/中/低，class 填 h/m/l |
| S2 自我清晰度 | `{{S2}}` | `{{S2_CLASS}}` | 同上 |
| S3 核心价值 | `{{S3}}` | `{{S3_CLASS}}` | 同上 |
| E1 依恋安全感 | `{{E1}}` | `{{E1_CLASS}}` | 同上 |
| E2 情感投入度 | `{{E2}}` | `{{E2_CLASS}}` | 同上 |
| E3 边界与依赖 | `{{E3}}` | `{{E3_CLASS}}` | 同上 |
| A1 世界观倾向 | `{{A1}}` | `{{A1_CLASS}}` | 同上 |
| A2 规则与灵活度 | `{{A2}}` | `{{A2_CLASS}}` | 同上 |
| A3 人生意义感 | `{{A3}}` | `{{A3_CLASS}}` | 同上 |
| Ac1 动机导向 | `{{AC1}}` | `{{AC1_CLASS}}` | 同上 |
| Ac2 决策风格 | `{{AC2}}` | `{{AC2_CLASS}}` | 同上 |
| Ac3 执行模式 | `{{AC3}}` | `{{AC3_CLASS}}` | 同上 |
| So1 社交主动性 | `{{SO1}}` | `{{SO1_CLASS}}` | 同上 |
| So2 人际边界感 | `{{SO2}}` | `{{SO2_CLASS}}` | 同上 |
| So3 表达与真实度 | `{{SO3}}` | `{{SO3_CLASS}}` | 同上 |

class 规则：高 → `h`，中 → `m`，低 → `l`（小写）
值显示规则：高 → `高`，中 → `中`，低 → `低`（中文）

**TOP 3 占位符：**

| 占位符 | 替换为 | 示例 |
|--------|--------|------|
| `{{TOP1_CODE}}` | 第 1 名人格代码 | `CTRL` |
| `{{TOP1_NAME}}` | 第 1 名中文名 | `拿捏者` |
| `{{TOP1_PCT}}` | 第 1 名匹配度 | `93` |
| `{{TOP2_CODE}}` | 第 2 名人格代码 | `BOSS` |
| `{{TOP2_NAME}}` | 第 2 名中文名 | `领导者` |
| `{{TOP2_PCT}}` | 第 2 名匹配度 | `87` |
| `{{TOP3_CODE}}` | 第 3 名人格代码 | `GOGO` |
| `{{TOP3_NAME}}` | 第 3 名中文名 | `行者` |
| `{{TOP3_PCT}}` | 第 3 名匹配度 | `83` |

#### 6.2.1 部署前验证（必须执行）

在写入 HTML 文件之前，**必须逐项确认以下占位符已全部替换**：

```
✅ 检查清单（逐项确认）：
□ PERSONALITY_CODE / PERSONALITY_NAME / MATCH_PERCENT — 基础信息
□ OPENING_LINE / DESCRIPTION — 开场白和描述
□ AVATAR_BASE64 — 头像 base64（用 base64 命令生成）
□ RADAR_S / RADAR_E / RADAR_A / RADAR_AC / RADAR_SO — 五维雷达得分（H=100,M=60,L=25 取均值）
□ RARITY_TIER / RARITY_LABEL / RARITY_PCT / RARITY_CLASS — 稀有度（查 personalities.md）
□ S1~SO3 + S1_CLASS~SO3_CLASS — 15 维度值和 CSS class
□ TOP1~TOP3 的 CODE / NAME / PCT — TOP 3 匹配
```

> **如果最终 HTML 中仍包含 `{{` 字符串，说明有占位符未被替换，必须修复后才能部署。**

#### 6.3 打包并部署

由于头像已内联为 base64，部署包**只需要一个 index.html 文件**，无需任何外部资源：

```bash
# 1. 创建临时目录（每次清空重建）
rm -rf /tmp/sbti-deploy && mkdir -p /tmp/sbti-deploy

# 2. 将替换完占位符的 HTML 写入 index.html
#   （Agent 用写文件工具将最终 HTML 写入 /tmp/sbti-deploy/index.html）

# 3. 打包（只有 index.html 一个文件）
cd /tmp/sbti-deploy && zip -r /tmp/sbti-result.zip .

# 4. 提交部署
node {baseDir}/deploy/deploy_skill.js submit \
  --zip /tmp/sbti-result.zip \
  --bot-id BOT_ID \
  --chat-id CHAT_ID \
  --chat-type channel \
  --channel slack
```

> **关键**：模板中的头像图片已经通过 `{{AVATAR_BASE64}}` 内联到 HTML 的 `<img src="data:image/webp;base64,...">` 中，**不需要复制任何图片文件**，zip 里只有 `index.html`。

#### 6.4 部署成功后的消息

当部署完成，向用户发送：

```
🎉 你的 SBTI 测试结果页已上线！

🔗 链接：{link}

分享文案（已复制到剪贴板）：
"我的 SBTI 赛博人格是【{代码}】{中文名}！匹配度 {百分比}%，来测测你的 → {link}"
```

**部署规则（强制执行）：**
- **唯一部署通道**：只能使用 `{baseDir}/deploy/deploy_skill.js`，最终 URL 必须是 `nexu.space` 域名
- **禁止替代方案**：不得使用 GitHub Gist、GitHub Pages、htmlpreview、Vercel、Netlify 或任何其他方式部署
- **禁止自建 HTML**：必须使用 `{baseDir}/templates/sbti-result/template.html` 模板，不得从零编写 HTML
- **禁止外部资源引用**：最终 HTML 不得引用任何外部图片/CSS/JS URL，所有资源必须内联（头像用 base64、样式用 inline CSS）
- **不要使用绝对路径**：所有 `{baseDir}` 引用必须是相对路径
- 不要捏造 job id、URL 或完成状态
- 部署期间不能说"已上线"——必须等到 status=succeeded 且有 nexu.space URL
- 如果部署失败，如实告知用户错误信息，**不得自行切换到其他部署方式**

---

## 关于 SBTI

SBTI (Shit Brain Type Indicator) 是一个互联网爆款人格测试，2025 年 4 月在 B 站、小红书、朋友圈大规模传播。它是对 MBTI 的戏仿，通过 30 道题的 5 大模型 × 15 维度系统，匹配 27 种"沙雕但精准"的人格类型。

- 原版：https://sbti.unun.dev/
- 作者 B 站：https://space.bilibili.com/417038183
- 参考视频：https://www.bilibili.com/video/BV1LpDHByET6/

