persona-creator
# Persona Creator — 数字人风格生成器
## 触发条件
以下任意情况下激活本 Skill:
**风格分析类:**
- 用户说"生成我的数字人"、"分析我的风格"、"创建我的风格档案"、"persona"
- 用户说"更新我的风格"、"刷新风格"、"refresh persona"
- 用户说"遗忘我的风格"、"删除档案"、"forget persona"、"重置档案"
**角色扮演类:**
- 消息以 `/superme <用户名>` 开头(进入角色扮演)
- 消息以 `/superme clear` 开头(退出角色扮演)
- 消息以 `[扮演<用户名>]` 或 `[as:<用户名>]` 开头(进入角色扮演)
---
## 路径约定
所有路径相对于当前 workspace(通常为 `/root/.openclaw/workspace` 或 `$GF_IDE_DEFAULT_PROJECT_ROOT` 的父目录):
- `memory/` — 短期记忆文件目录(`memory/YYYY-MM-DD.md`)
- `persona/` — 风格档案输出目录
- `persona/yourself.json` — 通用模板,不可删除
- `persona/$user.json` — 用户个人风格档案
Skill 脚本目录(相对本 SKILL.md):`./scripts/`
---
## 功能一:首次生成风格档案
### 触发词
"生成我的数字人"、"分析我的风格"、"创建风格档案"
### 执行流程
**Step 1:询问用户名**
```
你好!我需要你的名字/昵称来创建风格档案(例如:张三、alice、tom)
请输入你的名字:
```
**Step 2:确认 memory 目录**
- 默认从 `{workspace}/memory/` 读取
- 若不存在,提示用户提供路径
**Step 3:运行分析脚本(dry-run 先检查)**
```bash
python3 {skillDir}/scripts/analyze.py \
--user "{用户输入的名字}" \
--memory-dir "{workspace}/memory" \
--persona-dir "{workspace}/persona" \
--dry-run
```
- 若发言数 < 10,告知用户并停止,给出提示:
> "当前仅找到 N 条发言记录,至少需要 10 条才能生成可靠的风格分析。请继续使用后再试。"
**Step 4:运行完整分析,获取 prompt**
```bash
python3 {skillDir}/scripts/analyze.py \
--user "{名字}" \
--memory-dir "{workspace}/memory" \
--persona-dir "{workspace}/persona"
```
从输出中提取 `ANALYSIS_PROMPT_START` 到 `ANALYSIS_PROMPT_END` 之间的内容。
**Step 5:调用 LLM 进行风格分析**
将提取出的 prompt 直接作为用户消息发给自身(或用 exec 写入文件后读取),要求 LLM 严格按 JSON 格式输出。
**Step 6:保存结果**
将 LLM 输出的 JSON 字符串保存到 `/tmp/persona_analysis_result.json`,然后运行:
```bash
python3 {skillDir}/scripts/save_persona.py \
--analysis-file /tmp/persona_analysis_result.json \
--meta-file /tmp/persona_meta.json
```
**Step 7:展示摘要报告**
读取生成的 `persona/{名字}.json`,以用户友好的方式呈现:
```
✅ 数字人风格档案生成完成!
👤 用户:{名字}
📊 分析了 {N} 条发言记录({起始日期} ~ {结束日期})
🎭 风格画像:
• 整体语气:{tone.overall}
• 句式偏好:{sentence_structure.preference}
• Emoji 使用:{emoji_usage.frequency},常用 {emoji_usage.favorites}
• 专业程度:{professionalism.jargon_level}
• 幽默指数:{humor.level * 10:.0f}/10 — {humor.style}
💬 口头禅:{catchphrases 列表}
🔑 常用词:{common_phrases 列表}
🗂️ 话题偏好:{topic_preferences 列表}
💡 AI 模仿提示词已生成,可通过 /superme {名字} 进入角色扮演模式。
📁 档案保存位置:persona/{名字}.json
```
---
## 功能二:增量刷新
### 触发词
"更新我的风格"、"刷新档案"、"refresh"
### 执行流程
**Step 1:询问用户名**(若上下文中没有)
**Step 2:检查是否需要刷新**
```bash
python3 {skillDir}/scripts/refresh.py \
--user "{名字}" \
--memory-dir "{workspace}/memory" \
--persona-dir "{workspace}/persona"
```
- 若输出 `SKIP:true`,告知用户"无需刷新"
- 若输出 `REFRESH_NEEDED:true`,继续执行新文件的分析
**Step 3:仅对新文件运行分析,合并结果**
- 按与功能一 Step 4-6 相同的流程处理
- save_persona.py 会自动保留 `created_at` 并递增 `version`
**Step 4:展示刷新结果**(与功能一 Step 7 格式相同)
---
## 功能三:遗忘/删除档案
### 触发词
"遗忘我的风格"、"删除档案"、"forget"、"重置"
### 执行流程
**Step 1:询问用户名 + 确认操作**
```
⚠️ 确认要删除 {名字} 的风格档案吗?
[1] 完全删除(可恢复备份会保留)
[2] 重置为空白模板(保留文件)
[3] 取消
```
**Step 2:执行对应操作**
完全删除:
```bash
python3 {skillDir}/scripts/forget.py --user "{名字}" --persona-dir "{workspace}/persona"
```
重置模板:
```bash
python3 {skillDir}/scripts/forget.py --user "{名字}" --persona-dir "{workspace}/persona" --reset
```
**Step 3:确认反馈**
- 删除:`🗑️ {名字} 的风格档案已删除,备份保存为 persona/{名字}.bak.XXXXXX.json`
- 重置:`🔄 {名字} 的风格档案已重置为空白模板`
---
## 功能四:角色扮演模式
### 触发方式 A:斜杠命令
**进入:** 消息以 `/superme <用户名>` 开头
**退出:** 消息以 `/superme clear` 开头
### 触发方式 B:前缀模式
**进入:** 消息以 `[扮演<名字>]` 或 `[as:<名字>]` 开头
**退出:** 消息以 `[/扮演]` 或 `[/as]` 开头
### 进入角色扮演流程
**Step 1:加载 persona 档案**
```python
persona_path = f"{workspace}/persona/{用户名}.json"
```
若档案不存在:
> `❌ 未找到 {用户名} 的风格档案,请先运行"生成我的数字人"创建档案。`
**Step 2:构建角色扮演系统提示**
从 `persona.system_prompt_fragment` 提取基础描述,拼接完整 system prompt:
```
你现在要完全模仿用户「{display_name}」的说话风格来回答问题。
【风格要求】
{persona.persona.system_prompt_fragment}
【具体要求】
- 语气:{persona.persona.tone.overall},正式程度 {persona.persona.tone.formality_level*10:.0f}/10
- 句式:{persona.persona.sentence_structure.preference}
- Emoji:使用频率「{persona.persona.emoji_usage.frequency}」,偏爱 {persona.persona.emoji_usage.favorites}
- 口头禅:适当穿插 {persona.persona.catchphrases}
- 常用词:{persona.persona.common_phrases}
- 结构化:表格使用={persona.persona.formatting.loves_tables},列表={persona.persona.formatting.uses_lists}
- 幽默风格:{persona.persona.humor.style}
【重要】只模仿说话风格,不要模仿具体事项。回答时保持自然,不要提及"我在模仿xxx"。
```
**Step 3:进入角色扮演状态**
向用户确认:
```
🎭 已进入角色扮演模式 — 正在模仿「{display_name}」的风格
(输入 /superme clear 或 [/扮演] 退出)
```
**Step 4:以角色风格回答用户问题**
从用户消息中去掉前缀(如 `/superme 名字 ` 或 `[扮演名字]`),将剩余内容作为实际问题,用角色风格回答。
**Step 5:退出角色扮演**
收到退出指令后:
```
👋 已退出角色扮演模式,恢复正常模式。
```
---
## 错误处理
| 错误情况 | 处理方式 |
|---------|---------|
| memory 目录不存在 | 提示用户指定正确路径 |
| 发言数 < 10 | 提示需要更多对话记录 |
| LLM 返回格式错误 | 提示用户重试,或手动修正 JSON |
| persona 文件不存在 | 提示先创建档案 |
| yourself.json 模板缺失 | 从 skillDir 重建默认模板 |
---
## 文件结构
```
{skillDir}/
├── SKILL.md ← 本文件
├── persona/
│ └── yourself.json ← 通用模板(勿删)
└── scripts/
├── analyze.py ← 提取发言 + 生成分析 prompt
├── save_persona.py ← 保存 LLM 分析结果
├── refresh.py ← 增量刷新检测
└── forget.py ← 删除/重置档案
```
用户档案生成在:`{workspace}/persona/{用户名}.json`
标签
skill
ai