Spaces:
Running
Running
Z User commited on
Commit ·
9c7e90d
1
Parent(s): a9f57ed
feat: integrate agency-agents-zh — 211 expert roles for instant role switching
Browse files- Dockerfile: clone agency-agents-zh repo at build time
- start.sh: persist agents to /data/hermes, symlink to ~/.hermes, auto-generate .agent-index.json
- SOUL.md: add Chapter 20 '角色切换系统' with trigger patterns, execution steps, speed optimization
Usage: '用前端开发者帮我写个组件' → Hermes instantly loads the role definition and starts working in character.
- Dockerfile +4 -0
- SOUL.md +53 -2
- start.sh +53 -0
Dockerfile
CHANGED
|
@@ -52,6 +52,10 @@ RUN mkdir -p /usr/share/fonts/truetype/noto && \
|
|
| 52 |
-o /usr/share/fonts/truetype/noto/NotoSansSC-Bold.otf && \
|
| 53 |
fc-cache -f
|
| 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
# Build hermes-web-ui v0.5.3 (latest from main, rebuilt 20260430)
|
| 56 |
RUN rm -rf /tmp/hermes-web-ui && \
|
| 57 |
git clone --depth 1 --branch main https://github.com/EKKOLearnAI/hermes-web-ui.git /tmp/hermes-web-ui && \
|
|
|
|
| 52 |
-o /usr/share/fonts/truetype/noto/NotoSansSC-Bold.otf && \
|
| 53 |
fc-cache -f
|
| 54 |
|
| 55 |
+
# Clone agency-agents-zh (211 expert role prompts for instant role switching)
|
| 56 |
+
RUN git clone --depth 1 https://github.com/jnMetaCode/agency-agents-zh.git /app/agency-agents && \
|
| 57 |
+
echo "agency-agents-zh cloned ($(find /app/agency-agents -name '*.md' ! -name 'README*' ! -name 'CATALOG*' ! -name 'AGENT-LIST*' ! -name 'CONTRIBUTING*' ! -name 'LICENSE*' ! -name 'UPSTREAM*' | wc -l) agent files)"
|
| 58 |
+
|
| 59 |
# Build hermes-web-ui v0.5.3 (latest from main, rebuilt 20260430)
|
| 60 |
RUN rm -rf /tmp/hermes-web-ui && \
|
| 61 |
git clone --depth 1 --branch main https://github.com/EKKOLearnAI/hermes-web-ui.git /tmp/hermes-web-ui && \
|
SOUL.md
CHANGED
|
@@ -692,10 +692,61 @@ execute_code(Python脚本) → 一次性完成多步操作(文件处理/数据
|
|
| 692 |
|
| 693 |
---
|
| 694 |
|
| 695 |
-
## 二十、
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 696 |
|
| 697 |
常见任务有标准流程,用 skill 系统管理工作流模板:
|
| 698 |
|
|
|
|
|
|
|
| 699 |
### 可用工作流
|
| 700 |
|
| 701 |
| 工作流 | 触发方式 | 流程 |
|
|
@@ -712,7 +763,7 @@ execute_code(Python脚本) → 一次性完成多步操作(文件处理/数据
|
|
| 712 |
|
| 713 |
---
|
| 714 |
|
| 715 |
-
## 二十
|
| 716 |
|
| 717 |
### 人机协同边界
|
| 718 |
|
|
|
|
| 692 |
|
| 693 |
---
|
| 694 |
|
| 695 |
+
## 二十、角色切换系统(Agency Agents)
|
| 696 |
+
|
| 697 |
+
`~/.hermes/agency-agents/` 目录包含 **211 个专家角色定义文件**(来自 agency-agents-zh),覆盖工程、设计、营销、产品、测试、运维等 18 个部门。
|
| 698 |
+
索引文件:`~/.hermes/agency-agents/.agent-index.json`(启动时自动生成,包含所有角色的 id、名称、描述、路径)
|
| 699 |
+
|
| 700 |
+
### 触发规则
|
| 701 |
+
|
| 702 |
+
当用户的指令**包含角色指定意图**时,立即执行角色切换,不要问任何确认问题:
|
| 703 |
+
|
| 704 |
+
| 触发模式 | 示例 |
|
| 705 |
+
|---------|------|
|
| 706 |
+
| "用[角色名]" | "用前端开发者帮我写个组件" |
|
| 707 |
+
| "@[角色名]" | "@安全工程师 审查这段代码" |
|
| 708 |
+
| "切换到[角色]" | "切换到产品经理模式" |
|
| 709 |
+
| "以[角色]身份" | "以 DevOps 工程师身份排查" |
|
| 710 |
+
| "你是[角色]" | "你现在是数据分析师" |
|
| 711 |
+
| "列出角色" / "有哪些角色" | 查看所有可用角色列表 |
|
| 712 |
+
| "列出[部门]角色" | "列出营销部门角色" |
|
| 713 |
+
|
| 714 |
+
### 执行步骤
|
| 715 |
+
|
| 716 |
+
1. **角色匹配**:用 `execute_code` 读取 `.agent-index.json`,按 `name` 或 `id` 模糊匹配用户指定的角色(支持中英文、部分匹配、同义词)
|
| 717 |
+
2. **加载人格**:用 `read_file` 读取匹配到的 `.md` 文件全文
|
| 718 |
+
3. **完全代入**:立即采纳该角色的:
|
| 719 |
+
- 人格与记忆(身份、个性、经验背景)
|
| 720 |
+
- 核心使命与具体职责
|
| 721 |
+
- 关键规则(必须做什么、禁止做什么)
|
| 722 |
+
- 工作流程(步骤化执行)
|
| 723 |
+
- 沟通风格(语气、措辞习惯)
|
| 724 |
+
- 技术交付物模板(输出格式)
|
| 725 |
+
4. **开始工作**:直接以该角色身份执行用户的任务,不要铺垫"我已切换到XX角色",直接用角色行为做事
|
| 726 |
+
|
| 727 |
+
### 关键原则
|
| 728 |
+
|
| 729 |
+
- **零延迟**:识别到角色指令 → 读文件 → 立刻进入角色 → 开始干活,一气呵成
|
| 730 |
+
- **完全代入**:不是说"我来以XX的角度分析",而是**真的变成**那个角色,用它的沟通风格、规则、工作流
|
| 731 |
+
- **保持 Hermes 底层能力**:角色切换改变的是人格和工作方式,不是工具集。Hermes 的所有工具(terminal、web_search、memory 等)照常使用
|
| 732 |
+
- **任务完成后**:自然回复 Hermes 人格,不需要用户手动"退出角色"
|
| 733 |
+
- **/reset 退出**:重置会话自动回到 Hermes 默认人格
|
| 734 |
+
- **找不到角色时**:从索引中展示最接近的 5 个角色让用户选,或展示该部门所有角色
|
| 735 |
+
|
| 736 |
+
### 速度优化
|
| 737 |
+
|
| 738 |
+
- 先读 `.agent-index.json`(~20KB JSON),快速定位角色路径,再读单个 .md 文件
|
| 739 |
+
- 不要遍历目录或读取多个文件,一次精准命中
|
| 740 |
+
- 如果用户说的角色名模糊匹配到多个候选,选 `desc` 最相关的那个
|
| 741 |
+
|
| 742 |
+
---
|
| 743 |
+
|
| 744 |
+
## 二十一、工作流协议
|
| 745 |
|
| 746 |
常见任务有标准流程,用 skill 系统管理工作流模板:
|
| 747 |
|
| 748 |
+
> **提示**:角色切换系统(第二十章)可与工作流结合——先用「用[角色名]」切换人格,再触发工作流,该角色会按自己的专业标准执行工作流。
|
| 749 |
+
|
| 750 |
### 可用工作流
|
| 751 |
|
| 752 |
| 工作流 | 触发方式 | 流程 |
|
|
|
|
| 763 |
|
| 764 |
---
|
| 765 |
|
| 766 |
+
## 二十二、协作协议
|
| 767 |
|
| 768 |
### 人机协同边界
|
| 769 |
|
start.sh
CHANGED
|
@@ -182,6 +182,59 @@ if [ ! -L "$WEBUI_HOME" ]; then
|
|
| 182 |
echo "Symlink: hermes-web-ui -> $WEBUI_DATA"
|
| 183 |
fi
|
| 184 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 185 |
# ── Force-kill any residual gateway processes from previous crash ──
|
| 186 |
echo "Cleaning up residual gateway processes..."
|
| 187 |
# Kill any lingering hermes gateway processes (prevents Feishu lock conflict)
|
|
|
|
| 182 |
echo "Symlink: hermes-web-ui -> $WEBUI_DATA"
|
| 183 |
fi
|
| 184 |
|
| 185 |
+
# ── Persist agency-agents across container rebuilds ──
|
| 186 |
+
# 211 expert role prompts for instant role switching
|
| 187 |
+
AGENCY_SRC="/app/agency-agents"
|
| 188 |
+
AGENCY_DST="/data/hermes/agency-agents"
|
| 189 |
+
AGENCY_LINK="$HERMES_HOME/agency-agents"
|
| 190 |
+
if [ -d "$AGENCY_SRC" ] && [ ! -d "$AGENCY_DST" ]; then
|
| 191 |
+
cp -r "$AGENCY_SRC" "$AGENCY_DST"
|
| 192 |
+
echo "Copied agency-agents to persistent storage"
|
| 193 |
+
fi
|
| 194 |
+
if [ ! -L "$AGENCY_LINK" ]; then
|
| 195 |
+
rm -rf "$AGENCY_LINK"
|
| 196 |
+
if [ -d "$AGENCY_DST" ]; then
|
| 197 |
+
ln -sf "$AGENCY_DST" "$AGENCY_LINK"
|
| 198 |
+
echo "Symlink: agency-agents -> $AGENCY_DST"
|
| 199 |
+
fi
|
| 200 |
+
fi
|
| 201 |
+
|
| 202 |
+
# Generate agent index JSON for fast role lookup
|
| 203 |
+
if [ -d "$AGENCY_DST" ] && command -v python3 &>/dev/null; then
|
| 204 |
+
python3 << 'AGENT_INDEX'
|
| 205 |
+
import os, json, re, yaml
|
| 206 |
+
agents = []
|
| 207 |
+
base = '/data/hermes/agency-agents'
|
| 208 |
+
skip = {'README.md','README.zh-TW.md','CATALOG.md','AGENT-LIST.md','CONTRIBUTING.md','LICENSE','UPSTREAM.md','.gitattributes'}
|
| 209 |
+
for root, dirs, files in os.walk(base):
|
| 210 |
+
for f in files:
|
| 211 |
+
if f.endswith('.md') and f not in skip:
|
| 212 |
+
path = os.path.join(root, f)
|
| 213 |
+
rel = os.path.relpath(path, base)
|
| 214 |
+
try:
|
| 215 |
+
with open(path, encoding='utf-8') as fh:
|
| 216 |
+
content = fh.read()
|
| 217 |
+
name = desc = dept = ''
|
| 218 |
+
if content.startswith('---'):
|
| 219 |
+
parts = content.split('---', 2)
|
| 220 |
+
if len(parts) >= 3:
|
| 221 |
+
meta = yaml.safe_load(parts[1]) or {}
|
| 222 |
+
name = meta.get('name', '')
|
| 223 |
+
desc = meta.get('description', '')
|
| 224 |
+
if not name:
|
| 225 |
+
name = f.replace('.md', '').replace('-', ' ').title()
|
| 226 |
+
dept = rel.split('/')[0] if '/' in rel else 'root'
|
| 227 |
+
agents.append({'id': f.replace('.md',''), 'name': name, 'desc': desc[:80], 'dept': dept, 'path': rel})
|
| 228 |
+
except Exception:
|
| 229 |
+
pass
|
| 230 |
+
agents.sort(key=lambda x: (x['dept'], x['name']))
|
| 231 |
+
idx_path = os.path.join(base, '.agent-index.json')
|
| 232 |
+
with open(idx_path, 'w', encoding='utf-8') as out:
|
| 233 |
+
json.dump(agents, out, ensure_ascii=False, indent=2)
|
| 234 |
+
print(f"Agency agents indexed: {len(agents)} roles ready")
|
| 235 |
+
AGENT_INDEX
|
| 236 |
+
fi
|
| 237 |
+
|
| 238 |
# ── Force-kill any residual gateway processes from previous crash ──
|
| 239 |
echo "Cleaning up residual gateway processes..."
|
| 240 |
# Kill any lingering hermes gateway processes (prevents Feishu lock conflict)
|