今天被一个读者问到:你一个人怎么同时搞定写文章、敲代码、做运营的?我说因为我有"分身术"。
他以为我在开玩笑。其实 Hermes Agent 的 Profile 机制,就是我的分身术。
这篇文章,我用前端工程师(开发天气看板)完整的实战案例,把 Profile 的搭建和使用全部讲清楚,看完你就能动手。
Profile = 独立的 AI 分身。
不是简单的开多个对话窗口,而是每个 Profile 有自己独立的:
Profile 目录结构
─────────────────────────────────────────────
~/.hermes/profiles/
├── content-expert/ ← 内容专家角色
│ ├── config.yaml │ 用什么模型
│ ├── .env │ 用什么 API Key
│ ├── SOUL.md │ 角色灵魂定义
│ ├── skills/ │ 专属技能
│ ├── sessions/ │ 独立会话历史
│ ├── memories/ │ 角色记忆
│ └── workspace/ │ 独立工作目录
│
├── frontend-dev/ ← 前端工程师角色
│ ├── config.yaml
│ ├── SOUL.md
│ └── skills/
└── ...
─────────────────────────────────────────────
每个角色各玩各的,互不干扰。你让内容专家去写文章,它不会突然跳出来问你数据库怎么优化。
运营一个技术公众号,你可能需要:
- 一个角色专门写文章
- 一个角色专门做代码演示
- 一个角色专门核查内容真实性
用普通对话?每次切换都要重新告诉 AI"你现在是XXX",上下文来回折腾。
同时做前端和后端:
- 前端专家记住你的 React/Vue 偏好、组件库、项目结构
- 后端专家记住你的数据库设计、API 规范、部署方式
- 架构师专门做技术方案评审
每个角色各司其职,不用每次从零调教。
用 Hermes 的 delegate_task + Kanban 看板,可以实现:
选题研究员 ──→ 内容专家 ──→ 审核编辑 ──→ 发布专员
(找选题) (写文章) (审质量) (发出去)
hermes profile create 角色名称
创建一个前端工程师角色:
hermes profile create frontend-dev
运行效果:
$ hermes profile create frontend-dev
Profile 'frontend-dev' created at ~/.hermes/profiles/frontend-dev
89 bundled skills synced.
Wrapper created: /root/.local/bin/frontend-dev
📌 截图位置 1:运行
hermes profile create frontend-dev后的终端输出,保存截图到本地,后续插入文章。
以后运行 frontend-dev chat 就启动这个角色。
每个 Profile 有一个 SOUL.md 文件,这是角色的" DNA "。
nano ~/.hermes/profiles/frontend-dev/SOUL.md
内容这样写:
# 前端工程师 (Frontend Engineer)
你是一名专业的前端开发者,擅长 Vue / React / TypeScript / Node.js。
## 核心职责
1. 根据需求开发可运行的 Web 界面
2. 写代码前先理解需求,不盲目动手
3. 代码要有注释,变量命名要清晰
4. 完成后在 workspace/ 下交付完整可运行的项目
## 工作原则
- 用简洁的代码解决问题,不炫技
- 优先使用免费公开的 API
- 交付前在本地验证功能正常
- 不生成任何福利、优惠券、红包相关信息
📌 截图位置 2:SOUL.md 文件内容截图,展示编辑后的角色定义。
创建时已同步 89 个内置技能,还可以安装额外的:
# 安装技能(内容专家需要内容创作指南)
content-expert skills install chuangjian-ai-creator
# 安装技能(前端工程师需要 Node.js 调试能力)
frontend-dev skills install node-inspect-debugger
📌 截图位置 3:技能安装成功的终端输出。
每次输入 content-expert chat 太长了?加个别名:
echo "alias ce='content-expert chat'" >> ~/.bashrc
echo "alias fe='frontend-dev chat'" >> ~/.bashrc
source ~/.bashrc
以后直接 ce "帮我写篇文章" 或 fe "帮我做个天气页面"。
创建一个"每日生活指数看板" Web 页面,功能包括:
- 当前时间(实时每秒更新)
- 天气信息
- 农历日期
- 黄历宜忌
- 穿衣指数
- 适合干什么 / 不适合干什么
天气看板实现架构
─────────────────────────────────────────────
┌─────────────────────────────────────────┐
│ index.html │
│ ┌─────────────────────────────────┐ │
│ │ 时间模块 │ 日期+星期 │ │
│ │ 实时跳动 │ 每日刷新 │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ 天气模块 │ 农历+黄历 │ │
│ │ 温度/状态 │ 宜忌/穿衣指数 │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ 生活指数模块 │ │
│ │ 适合/不适合 运动/出行/购物 │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐
│ 免费天气 API │ │ 黄历 API │
│ (和风天气等) │ │ (免费接口) │
└─────────────────┘ └──────────────────┘
─────────────────────────────────────────────
fe chat
然后输入:
帮我开发一个"每日生活指数看板"的单页面 Web 应用,
包含:当前时间、天气、农历、黄历宜忌、穿衣指数、
适合干什么、不适合干什么。
要求代码整洁,有注释,可直接在浏览器打开运行。
📌 截图位置 4:前端工程师角色接收需求后的回复,展示 AI 对需求的理解和拆解。
AI 会根据你的需求,在 ~/.hermes/profiles/frontend-dev/workspace/ 下生成代码文件。
生成的文件结构大概是这样:
workspace/
└── daily-board/
├── index.html ← 主页面
├── style.css ← 样式
├── app.js ← 逻辑
└── README.md ← 说明文档
📌 截图位置 5:workspace 目录下生成的文件列表(
ls -la workspace/daily-board/)。
index.html(结构):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>每日生活指数看板</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<!-- 时间模块 -->
<div class="card time-card">
<div id="clock" class="clock">00:00:00</div>
<div id="date" class="date"></div>
</div>
<!-- 天气模块 -->
<div class="card weather-card">
<h3>天气预报</h3>
<div id="weather" class="weather-info">加载中...</div>
</div>
<!-- 农历+黄历模块 -->
<div class="card lunar-card">
<h3>农历 · 黄历</h3>
<div id="lunar" class="lunar-info">加载中...</div>
<div id="lucky-advice" class="advice">
<span class="good">宜:运动、出行</span>
<span class="bad">忌:安葬、动土</span>
</div>
</div>
<!-- 穿衣指数 -->
<div class="card dressing-card">
<h3>穿衣指数</h3>
<div id="dressing" class="dressing-info">加载中...</div>
</div>
<!-- 生活指数 -->
<div class="card life-card">
<h3>今日生活指南</h3>
<div class="activity-list">
<div class="activity good">适合:户外跑步、读书</div>
<div class="activity good">适合:约朋友聚会</div>
<div class="activity bad">不适合:长时间户外运动</div>
<div class="activity bad">不适合:做重大决定</div>
</div>
</div>
</div>
<script src="app.js"></script>
</body>
</html>
app.js(逻辑):
// 每日生活指数看板 - 主逻辑
// API 来源:和风天气(免费)、农历API(免费)
// ===== 1. 实时时钟 =====
function updateClock() {
const now = new Date();
const timeStr = now.toLocaleTimeString('zh-CN', { hour12: false });
const dateStr = now.toLocaleDateString('zh-CN', {
year: 'numeric', month: 'long', day: 'numeric', weekday: 'long'
});
document.getElementById('clock').textContent = timeStr;
document.getElementById('date').textContent = dateStr;
}
setInterval(updateClock, 1000);
updateClock();
// ===== 2. 获取天气 =====
async function fetchWeather() {
// 使用和风天气免费API(需要注册获取 KEY)
const API_KEY = 'YOUR_HEFENG_KEY';
const location = '深圳'; // 可改成你的城市
const url = `https://devapi.qweather.com/v7/weather/now?key=${API_KEY}&location=${location}`;
try {
const resp = await fetch(url);
const data = await resp.json();
if (data.code === '200') {
const w = data.now;
document.getElementById('weather').innerHTML = `
<div class="temp">${w.temp}°C</div>
<div class="text">${w.text}</div>
<div class="detail">湿度 ${w.humidity}% · 风速 ${w.windSpeed}km/h</div>
`;
}
} catch (e) {
document.getElementById('weather').textContent = '天气加载失败';
}
}
// ===== 3. 获取农历和黄历 =====
async function fetchLunar() {
const url = `https://www.api.znba.cn/api/aipp/v1/calendar/lunar?date=${new Date().toLocaleDateString('zh-CN')}`;
try {
const resp = await fetch(url);
const data = await resp.json();
if (data.code === 0) {
const lunar = data.data;
document.getElementById('lunar').textContent =
`${lunar.lunarDate}(${lunar.lunarMonth}月${lunar.lunarDay})`;
// 渲染宜忌
const advice = document.getElementById('lucky-advice');
advice.innerHTML = `
<div class="good-advice">宜:${lunar.suitable.join('、')}</div>
<div class="bad-advice">忌:${lunar.unsuitable.join('、')}</div>
`;
}
} catch (e) {
document.getElementById('lunar').textContent = '农历加载失败';
}
}
// ===== 4. 生成生活指数 =====
function generateLifeAdvice(temp, weather) {
const advice = { good: [], bad: [] };
if (temp < 10) {
advice.good.push('室内健身');
advice.bad.push('户外长时间运动');
} else if (temp > 30) {
advice.good.push('游泳');
advice.bad.push('中午时段户外活动');
}
if (weather.includes('雨') || weather.includes('雪')) {
advice.good.push('室内阅读');
advice.bad.push('户外运动');
} else {
advice.good.push('户外跑步');
}
return advice;
}
fetchWeather();
fetchLunar();
📌 截图位置 6:VSCode 或编辑器中打开生成代码的截图,展示代码结构和注释。
cd ~/.hermes/profiles/frontend-dev/workspace/daily-board
python3 -m http.server 8080
然后浏览器打开 http://localhost:8080。
📌 截图位置 7:浏览器中打开页面的截图,展示完整效果(时间跳动、天气显示、宜忌列表等)。
有时你想让不同角色用不同的模型。创建 Profile 独立的 .env:
nano ~/.hermes/profiles/frontend-dev/.env
内容:
MINIMAX_CN_API_KEY=你的MiniMax密钥
这样前端工程师这个角色只走 MiniMax,不会用到主配置里的其他密钥。
Profile 创建后,在 config.yaml 里显式指定模型:
nano ~/.hermes/profiles/frontend-dev/config.yaml
内容:
default: MiniMax-M2.7
provider: minimax-cn
base_url: https://api.minimaxi.chat/v1
fallback_providers: []
📌 截图位置 8:config.yaml 配置截图,展示显式绑定的模型配置。
# 直接切换到某个角色
content-expert chat
# 快捷命令(需先设置 alias)
ce chat
fe chat
# 查看所有角色
hermes profile list
在主对话里,让前端工程师帮你查资料:
delegate_task(
goal="帮我找一个适合嵌入网页的免费天气 API",
context="需要支持中国城市,有免费额度",
toolsets=["web"]
)
# 创建看板
hermes kanban create "天气看板开发"
# 添加任务
hermes kanban add "完成首页布局" --to frontend-dev
hermes kanban add "接入天气 API" --to frontend-dev
hermes kanban add "内容审核" --to content-expert
# 查看状态
hermes kanban list
Q:Profile 和普通对话有什么区别?
| 对比项 | 普通对话 | Profile |
|---|---|---|
| 上下文 | 每次/new 清空 | 持久保存 |
| 角色记忆 | 无 | 有(SOUL.md) |
| 独立技能 | 无 | 有(Skills) |
| 独立模型配置 | 无 | 有 |
Q:一个 Profile 可以多个人用吗?
目前 Profile 是本地文件,共享同一个系统用户。如果多人需要各自的角色,各自部署 Hermes。
Q:Profile 可以用不同的 API Key 吗?
可以。在 ~/.hermes/profiles/角色名/.env 里写入独立密钥,会覆盖主配置。
快速上手路径
─────────────────────────────────────────────
1. hermes profile create xxx → 创建角色
2. nano ~/.hermes/profiles/xxx/SOUL.md → 写角色灵魂
3. xxx skills install yyy → 装技能(可选)
4. echo "alias xx='xxx chat'" >> ~/.bashrc → 设别名
5. source ~/.bashrc
6. xxx chat → 启动角色
─────────────────────────────────────────────
Hermes 的 Profile 机制,让 AI 不再是"每次从零开始"的工具,而是真正有记忆、有技能、能协作的团队成员。
一个人活成一支团队,从今天这篇文章开始。
💬 评论区