Hermes Agent中多Profile實(shí)戰(zhàn)小結(jié)
折騰 Hermes 也有一段時間了,從一開始的單一 agent 用著挺爽,到后來發(fā)現(xiàn)需求越來越多,一個 agent 根本不夠用。
你想想看,你白天寫代碼需要一個 coding assistant,晚上想搞個研究 bot 幫你盯 arXiv 論文,周末還想弄個寫作助手幫你整理筆記。這三個場景的模型選擇、記憶體系、技能樹完全不一樣,硬塞到一個 agent 里,遲早會精神分裂。
Profile 機(jī)制就是為了解決這個問題而生的。
什么是 Profile
坦率的講,Profile 就是 Hermes 的多實(shí)例隔離方案。
每個 Profile 是一個完全獨(dú)立的 Hermes agent,有自己的 config.yaml、.env、SOUL.md、skills/、sessions/、memory、logs/、cron jobs、gateway state,所有狀態(tài)全部隔離在各自的目錄里,互不干擾。
底層實(shí)現(xiàn)其實(shí)挺巧妙的。Hermes 代碼里有 119+ 個地方通過 get_hermes_home() 來解析路徑,Profile 機(jī)制通過設(shè)置 HERMES_HOME 環(huán)境變量,讓所有這些路徑自動指向?qū)?yīng) Profile 的目錄。
默認(rèn) Profile 就是 ~/.hermes 本身,自定義 Profile 在 ~/.hermes/profiles/<name>/。
完整的目錄結(jié)構(gòu)長這樣
~/.hermes/
├── config.yaml # 全局配置
├── .env # API Keys
├── hermes-agent/ # 源碼
├── sessions/ # Default profile sessions
├── skills/ # Default profile skills
└── profiles/
├── coder/ # Profile: 編程助手
│ ├── config.yaml # Profile 專屬配置
│ ├── .env # Profile 專屬 API Keys
│ ├── home/
│ │ ├── .lark-cli/hermes/config.json # Profile 專屬 lark-cli 配置
│ │ └── ...
│ ├── skills/
│ └── sessions/
├── research/ # Profile: 研究助手
└── writer/ # Profile: 寫作助手每個 Profile 通過 ~/.hermes/config.yaml 中的 channels.feishu.accounts 綁定獨(dú)立的飛書應(yīng)用。這套設(shè)計(jì)讓多個 agent 能在一臺機(jī)器上安靜地各過各的。
創(chuàng)建 Profile 的四種姿勢
空白創(chuàng)建
最干凈的方式,從零開始配置
hermes profile create coder
這會創(chuàng)建一個空的 ~/.hermes/profiles/coder/ 目錄,你需要自己跑一遍 coder setup 來配置模型、API key 這些。
克隆配置
如果你已經(jīng)有一個調(diào)好的 Profile,想基于它的配置創(chuàng)建一個新的,但 skills、sessions、memory 這些不要
hermes profile create research --clone
這會把 ~/.hermes/config.yaml 和 .env 復(fù)制過去,但其他狀態(tài)文件都是空的。適合「我想換個模型但其他配置差不多」的場景。
完整克隆
連 skills、memory、sessions 一起復(fù)制
hermes profile create backup --clone-all
這個我一般在做重大配置調(diào)整之前用,先完整克隆一份當(dāng)備份,改炸了還能回滾。
從指定 Profile 克隆
hermes profile create dev --clone-from coder
從 coder Profile 克隆配置到新的 dev Profile。適合你有多個 Profile,想基于某個特定 Profile 創(chuàng)建新實(shí)例的場景。
使用 Profile 的三種方式
命令別名
創(chuàng)建 Profile 的時候會自動生成一個命令別名
coder chat # 等同于 hermes -p coder chat coder gateway start # 啟動 coder 的 gateway coder config set model.default anthropic/claude-sonnet-4
這個別名是寫到 PATH 里的 wrapper script,用起來跟原生 hermes 命令沒區(qū)別。我自己最常用的就是這種方式,打字少。
-p 參數(shù)
不想用別名或者在腳本里動態(tài)指定 Profile
hermes -p coder chat hermes -p research gateway start
適合在 CI/CD 或者自動化腳本里用,Profile 名字可以作為變量傳入。
Sticky Default
如果你某段時間主要用某個 Profile,可以把它設(shè)為默認(rèn)
hermes profile use coder
之后直接 hermes chat 就會用 coder Profile,不用再打 -p。想切回去就 hermes profile use default。
使用 cat ~/.hermes/active_profile 查看當(dāng)前活躍的 Profile。
默認(rèn) Profile 和自定義 Profile 的區(qū)別
說到這個,很多人剛接觸 Profile 機(jī)制會有個疑問,默認(rèn) Profile 和自定義 Profile 到底有啥區(qū)別?
其實(shí)吧,從技術(shù)實(shí)現(xiàn)上看,它們沒有本質(zhì)區(qū)別。都是同樣的目錄結(jié)構(gòu),同樣的配置文件格式,同樣的命令接口。
唯一的區(qū)別是路徑
- 默認(rèn) Profile 是
~/.hermes/ - 自定義 Profile 是
~/.hermes/profiles/<name>/
默認(rèn) Profile 就是你最初安裝 Hermes 時的 ~/.hermes 目錄,不需要遷移,現(xiàn)有安裝直接就能用。自定義 Profile 是后來創(chuàng)建的,放在 profiles/ 子目錄下。
另外一個小區(qū)別是服務(wù)命名
- 默認(rèn) Profile 的 systemd 服務(wù)叫
hermes-gateway.service - 自定義 Profile 叫
hermes-gateway-<name>.service
這是為了向后兼容,早期版本只有默認(rèn) Profile,服務(wù)名沒有后綴。
但從我自己的使用體驗(yàn)來看,這兩者在功能上完全對等。你完全可以把默認(rèn) Profile 當(dāng)成一個「特殊的自定義 Profile」來理解。
多 Profile 的應(yīng)用場景
配置完了,來聊聊實(shí)際使用。我自己目前跑了三個 Profile,每個對應(yīng)不同的使用場景。
場景一,角色分離
這是最基礎(chǔ)的用法。不同 Profile 扮演不同角色
# 編程助手 hermes profile create coder coder config set model.default anthropic/claude-sonnet-4 echo "你是一個專注的編程助手,擅長代碼審查和調(diào)試。" > ~/.hermes/profiles/coder/SOUL.md # 研究助手 hermes profile create research research config set model.default openai/gpt-4-turbo echo "你是一個研究助手,擅長論文檢索和文獻(xiàn)綜述。" > ~/.hermes/profiles/research/SOUL.md # 寫作助手 hermes profile create writer writer config set model.default anthropic/claude-3-opus echo "你是一個技術(shù)寫作助手,擅長把復(fù)雜概念講清楚。" > ~/.hermes/profiles/writer/SOUL.md
每個 Profile 有自己的 SOUL.md 來定義人格,有自己的 skills 來定義能力邊界。coder 裝了 debugging 和 development-workflow 技能,research 裝了 research-workflow 技能,writer 裝了 qiye-writer 技能。
互不干擾,各司其職。
場景二,項(xiàng)目隔離
如果你同時參與多個項(xiàng)目,每個項(xiàng)目有自己的技術(shù)棧和約定,可以用 Profile 來隔離
hermes profile create project-a project-a config set terminal.cwd /path/to/project-a project-a config set model.default anthropic/claude-sonnet-4 hermes profile create project-b project-b config set terminal.cwd /path/to/project-b project-b config set model.default openai/gpt-4-turbo
terminal.cwd 設(shè)置工作目錄,這樣每個 Profile 啟動后自動 cd 到對應(yīng)項(xiàng)目。配合項(xiàng)目根目錄的 AGENTS.md 或 CLAUDE.md,agent 會自動加載項(xiàng)目約定。
這個方案比在同一個 agent 里反復(fù)切換工作目錄要干凈得多。
場景三,模型對比
有時候你想對比不同模型在同一個任務(wù)上的表現(xiàn),可以創(chuàng)建多個 Profile,每個用不同的模型
hermes profile create test-claude test-claude config set model.default anthropic/claude-sonnet-4 hermes profile create test-gpt4 test-gpt4 config set model.default openai/gpt-4-turbo hermes profile create test-local test-local config set model.default ollama/llama3 test-local config set model.base_url http://localhost:11434
然后給它們同樣的任務(wù),對比輸出質(zhì)量。我自己用這個方法來測試新模型,決定要不要把主力 Profile 切過去。
場景四,沙盒和生產(chǎn)
同一個配置,跑兩個實(shí)例,一個用于測試,一個用于生產(chǎn)
hermes profile create staging --clone production staging config set model.default openai/gpt-4-turbo-preview staging config set terminal.cwd /path/to/staging
staging 克隆了 production 的所有配置,但工作目錄和模型不同。你可以在 staging 里隨便折騰,確認(rèn)沒問題了再把配置同步到 production。
多 Profile 協(xié)作
單個 Profile 各自為戰(zhàn)已經(jīng)很強(qiáng)了,但 Hermes 還提供了多 Profile 協(xié)作的機(jī)制。
Kanban 工作隊(duì)列
這是 Hermes 的多 agent 協(xié)作核心。一個 SQLite 數(shù)據(jù)庫作為共享看板,多個 Profile 作為 worker 領(lǐng)取任務(wù)
# 初始化看板 hermes kanban init # 創(chuàng)建任務(wù) hermes kanban create "實(shí)現(xiàn)用戶登錄模塊" --assign coder # 查看任務(wù)狀態(tài) hermes kanban list
coder Profile 會自動領(lǐng)取分配給它的任務(wù),完成后標(biāo)記為 done。你可以在看板上看到所有任務(wù)的狀態(tài)、進(jìn)度、評論。
這個機(jī)制適合把一個大任務(wù)拆解成多個子任務(wù),分配給不同的 Profile 并行處理。比如一個 Profile 負(fù)責(zé)后端 API,一個負(fù)責(zé)前端 UI,一個負(fù)責(zé)測試用例。
delegate_task 子 agent
如果你不想搞這么重,可以用 delegate_task 在當(dāng)前 Profile 里臨時 spawn 子 agent
# 在 coder Profile 的會話里
delegate_task(
goal="實(shí)現(xiàn)用戶登錄的單元測試",
context="后端 API 已經(jīng)完成,使用 pytest,測試文件在 tests/test_auth.py",
toolsets=["terminal", "file"]
)
子 agent 有獨(dú)立的會話和終端,但共享父 agent 的進(jìn)程。適合臨時拆分一個子任務(wù),不需要長期運(yùn)行。
Profile Distributions
如果你調(diào)教出了一個很好用的 Profile,想分享給別人或者在多臺機(jī)器上同步,可以把它打包成 distribution
# 導(dǎo)出 hermes profile export coder # 生成 coder.tar.gz # 導(dǎo)入 hermes profile import coder.tar.gz
或者更進(jìn)一步,把 Profile 發(fā)布到 git 倉庫
hermes profile install github.com/you/research-bot --alias
別人一行命令就能安裝你的整個 agent 配置,包括 SOUL、skills、cron jobs、MCP 連接。credentials、memory、sessions 這些敏感數(shù)據(jù)不會打包,留在本地。
多 Profile 接入聊天平臺
這塊是我覺得 Hermes 設(shè)計(jì)得最優(yōu)雅的地方。
單 Profile 對應(yīng)單 Bot
每個 Profile 運(yùn)行自己的 gateway 進(jìn)程,有自己的 bot token
# coder Profile 的 .env TELEGRAM_BOT_TOKEN=111111:AAA... # research Profile 的 .env TELEGRAM_BOT_TOKEN=222222:BBB...
啟動各自的 gateway
coder gateway start # 啟動 coder 的 Telegram bot research gateway start # 啟動 research 的 Telegram bot
這樣你就有兩個獨(dú)立的 Telegram bot,一個負(fù)責(zé)編程,一個負(fù)責(zé)研究。用戶在 Telegram 里 @ 不同的 bot,消息會路由到對應(yīng)的 Profile。
飛書、Discord、Slack 這些平臺也是同樣的邏輯。每個 Profile 用自己的 bot token,運(yùn)行獨(dú)立的 gateway 進(jìn)程。
Token Lock 安全機(jī)制
如果你不小心讓兩個 Profile 用了同一個 bot token,第二個 gateway 會拒絕啟動,并報(bào)錯告訴你哪個 Profile 沖突了。
這個機(jī)制防止了消息路由混亂。坦率的講,我第一次配置的時候確實(shí)犯過這個錯,復(fù)制 .env 的時候忘了改 token,結(jié)果啟動第二個 gateway 的時候直接報(bào)錯。看到錯誤信息的那一刻我就知道,這個設(shè)計(jì)是真的貼心。
多 Profile 群聊
如果你想讓多個 Profile 在同一個群聊里協(xié)作,有幾種方案。
方案一,多 bot 同群
把多個 bot 拉到同一個群里,每個 bot 對應(yīng)一個 Profile
coder gateway start research gateway start writer gateway start
在 Telegram 群里 @coder 問編程問題,@research 問研究問題,@writer 讓它幫你潤色文章。每個 bot 只響應(yīng) @ 自己的消息。
方案二,單 bot + Profile 切換
如果不想搞這么多 bot,可以用一個 bot,通過命令切換 Profile
# 在 bot 的對話里 /profile coder # 切換到 coder Profile /profile research # 切換到 research Profile
但這個方案有個問題,切換 Profile 之后,之前的會話上下文就丟了。適合「我現(xiàn)在要用不同角色處理一個任務(wù)」的場景,不適合長期并行。
方案三,Kanban 協(xié)作群
創(chuàng)建一個專門的協(xié)作群,多個 bot 都在群里,通過 Kanban 看板協(xié)調(diào)任務(wù)
# 在群里發(fā)消息 @coder 實(shí)現(xiàn)登錄模塊 @research 調(diào)研 OAuth2 最佳實(shí)踐 @writer 整理成技術(shù)文檔
每個 bot 領(lǐng)取自己的任務(wù),完成后在看板上更新狀態(tài)。你可以在群里看到整個協(xié)作過程。
飛書接入實(shí)戰(zhàn)
說到飛書接入,我自己踩了不少坑,這里分享一下完整流程。
方式一,交互式配置(推薦)
不想手動編輯配置文件的話,Hermes 提供了交互式向?qū)?,一步步引?dǎo)你完成配置
hermes -p coder gateway setup
運(yùn)行后會進(jìn)入一個命令行交互界面,流程大概是這樣的
- 選擇接入渠道 — 列表里會有 Telegram、Discord、飛書、Slack 等選項(xiàng),選「飛書」
- 創(chuàng)建飛書應(yīng)用 — CLI 會生成一個二維碼或鏈接,用手機(jī)飛書掃碼,直接跳轉(zhuǎn)到飛書開放平臺的應(yīng)用創(chuàng)建頁面。這一步省去了你自己去開放平臺找入口、填表單的麻煩
- 自動獲取憑證 — 應(yīng)用創(chuàng)建完成后,App ID 和 App Secret 會自動回填到 CLI 里,不需要你手動復(fù)制粘貼
- 配置事件訂閱 — CLI 會提示你確認(rèn) webhook 回調(diào)地址,一般會自動生成本地監(jiān)聽地址。如果你用了反向代理或者 ngrok,在這里填公網(wǎng)可達(dá)的 URL
- 權(quán)限確認(rèn) — 飛書應(yīng)用需要開通消息收發(fā)等權(quán)限,CLI 會列出需要的權(quán)限清單,提醒你逐一開通
- 寫入配置 — 所有信息確認(rèn)后,CLI 自動把憑證寫入
~/.hermes/profiles/coder/.env
整個過程基本不用碰配置文件,對新手很友好。配置完之后直接啟動
coder gateway start
方式二,手動編輯配置
如果你更喜歡掌控每一步,或者交互式向?qū)С隽藛栴},也可以手動配置。
首先你需要在飛書開放平臺創(chuàng)建一個應(yīng)用,獲取 App ID 和 App Secret。然后在 Hermes 里配置
# 編輯 Profile 的 .env nano ~/.hermes/profiles/coder/.env
添加飛書的配置
FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx FEISHU_VERIFICATION_TOKEN=xxx FEISHU_ENCRYPT_KEY=xxx
然后啟動 gateway
coder gateway start
Hermes 會自動處理飛書的事件訂閱和消息路由。你可以在飛書里 @ 這個 bot,它會用 coder Profile 的配置來響應(yīng)。
如果你想讓多個 Profile 接入飛書,每個 Profile 需要創(chuàng)建獨(dú)立的飛書應(yīng)用,獲取各自的 App ID 和 Secret。然后在各自的 .env 里配置,啟動各自的 gateway。
這塊需要注意的是,飛書的應(yīng)用審核比較嚴(yán)格,創(chuàng)建多個應(yīng)用可能會觸發(fā)審核。我自己的做法是先用一個應(yīng)用測試,確認(rèn)配置沒問題了再創(chuàng)建其他應(yīng)用。
飛書流式卡片插件
Hermes 默認(rèn)的飛書回復(fù)是純文本,想實(shí)現(xiàn)打字機(jī)效果的流式卡片,需要裝一個社區(qū)插件 hermes-feishu-streaming-card。
這玩意其實(shí)是一個獨(dú)立的 sidecar 服務(wù),跑在 Hermes 旁邊。Hermes 通過 hook 機(jī)制把回復(fù)內(nèi)容發(fā)給 sidecar,sidecar 負(fù)責(zé)在飛書里創(chuàng)建和更新卡片。架構(gòu)上解耦得很干凈。
安裝過程
# 克隆項(xiàng)目 git clone https://github.com/baileyh8/hermes-feishu-streaming-card.git ~/hermes-feishu-streaming-card # 安裝到 Hermes Gateway 的 venv(必須,hook 需要能 import) source ~/.hermes/hermes-agent/venv/bin/activate pip install -e ~/hermes-feishu-streaming-card
安裝完了需要創(chuàng)建一個 sidecar 配置文件 ~/.hermes_feishu_card/config.yaml。多 Profile 模式下,每個 Profile 要獨(dú)立配置飛書憑據(jù)
server:
host: 127.0.0.1
port: 8765
profiles:
coder:
feishu:
app_id: "cli_aaa0395b87f69cb0"
app_secret: "真實(shí)appSecret"
base_url: https://open.feishu.cn/open-apis
timeout_seconds: 30
bots:
default: coder_bot
items:
coder_bot:
name: 編程助手
app_id: "cli_aaa0395b87f69cb0"
app_secret: "真實(shí)appSecret"
card:
title: 編程助手
bindings:
fallback_bot: coder_bot
chats: {}
card:
title: Hermes Coder
research:
feishu:
app_id: "cli_aaa03591c679dcc8"
app_secret: "真實(shí)appSecret"
base_url: https://open.feishu.cn/open-apis
timeout_seconds: 30
bots:
default: research_bot
items:
research_bot:
name: 研究助手
app_id: "cli_aaa03591c679dcc8"
app_secret: "真實(shí)appSecret"
card:
title: 研究助手
bindings:
fallback_bot: research_bot
chats: {}
card:
title: Hermes Research
card:
title: Hermes Agent
footer_fields:
- duration
- model
- input_tokens
- output_tokens
- context這里有個大坑需要注意。多 Profile 模式下,每個 Profile 的飛書憑據(jù)必須在 sidecar 配置里獨(dú)立設(shè)置,頂層的 FEISHU_APP_ID / FEISHU_APP_SECRET 環(huán)境變量會被直接忽略。我第一次配的時候沒注意這個,搞了半天卡片就是不出來,排查了一圈才發(fā)現(xiàn)憑據(jù)沒讀到。
配完了還需要開啟 Hermes 的流式編輯,在 ~/.hermes/config.yaml 里加
streaming: enabled: true transport: edit
然后診斷兼容性并安裝 hook
source ~/.hermes/hermes-agent/venv/bin/activate # 診斷兼容性 python3 -m hermes_feishu_card.cli doctor \ --config ~/.hermes_feishu_card/config.yaml \ --hermes-dir ~/.hermes/hermes-agent \ --explain # 安裝 hook python3 -m hermes_feishu_card.cli install \ --hermes-dir ~/.hermes/hermes-agent \ --yes
啟動 sidecar
python3 -m hermes_feishu_card.cli start --config ~/.hermes_feishu_card/config.yaml python3 -m hermes_feishu_card.cli status
預(yù)期看到 status: running 和 routing.bot_count 的數(shù)字,就說明跑起來了。
日常運(yùn)維就這幾個命令
# 查看狀態(tài) python3 -m hermes_feishu_card.cli status --config ~/.hermes_feishu_card/config.yaml # 停止 python3 -m hermes_feishu_card.cli stop --config ~/.hermes_feishu_card/config.yaml # 重啟(修改配置后需要) python3 -m hermes_feishu_card.cli stop --config ~/.hermes_feishu_card/config.yaml && \ python3 -m hermes_feishu_card.cli start --config ~/.hermes_feishu_card/config.yaml
關(guān)閉 Busy 通知
這個雖然是個小配置,但我覺得值得一提。
當(dāng) busy_input_mode 設(shè)為 steer 或 queue 的時候,Agent 正在忙,你又給它發(fā)了消息,它會回復(fù)一條通知
? Steered into current run (1 min elapsed, iteration 1/90). Your message arrives after the next tool call.
偶爾收到一次還行,頻繁交互的時候這條通知真的很煩。
關(guān)掉它很簡單,在 ~/.hermes/config.yaml 的 display 節(jié)下面加一行
display: busy_ack_enabled: false
原理是 gateway/run.py 里檢查 HERMES_GATEWAY_BUSY_ACK_ENABLED 這個環(huán)境變量,設(shè)為 false 后跳過發(fā)送通知,但輸入仍然正常處理,steer、queue、interrupt 這些邏輯完全不受影響。
改了之后記得重啟 Gateway 才會生效。
Lark-CLI 用戶身份授權(quán)
這塊是比較重要的一個話題,跟飛書的日歷功能直接相關(guān)。
Hermes 內(nèi)置的 feishu_calendar_tool.py 用的是 tenant_access_token,也就是應(yīng)用身份來調(diào)用飛書 API。啥意思呢?就是它創(chuàng)建的日程只會出現(xiàn)在飛書應(yīng)用自己的日歷上,不會出現(xiàn)在你的個人日歷里。
這顯然不是我們想要的效果。你想讓 Agent 幫你創(chuàng)建日程,日程得在你自己的日歷上能看到才行。
解決方案是用 lark-cli 走 OAuth 用戶授權(quán),拿到 user_access_token。
先把飛書憑據(jù)寫到對應(yīng) Profile 的 .env 里
echo 'FEISHU_APP_ID=cli_aaa0395b87f69cb0' >> ~/.hermes/profiles/coder/.env echo 'FEISHU_APP_SECRET=真實(shí)appSecret' >> ~/.hermes/profiles/coder/.env
然后把 lark-cli 綁定到 Hermes Profile
# 檢查是否已綁定 lark-cli config show # 綁定 lark-cli config bind --source hermes --identity user-default --force
幾個參數(shù)說一下。--source hermes 是自動從 HERMES_HOME 環(huán)境變量檢測配置來源,--identity user-default 是默認(rèn)使用用戶身份,這樣才能訪問個人日歷和云盤這些資源,--force 是確認(rèn)身份切換的風(fēng)險(xiǎn)。
綁定成功后會返回 ok: true 和 identity: user-default。
接下來是發(fā)起 OAuth 授權(quán)
lark-cli auth login --domain calendar --no-wait --json
輸出里會有 verification_url 和 device_code。可以生成二維碼方便手機(jī)掃碼
cd /tmp && lark-cli auth qrcode "驗(yàn)證鏈接" --output lark_auth_qr.png
讓用戶在手機(jī)飛書里掃碼授權(quán)。掃完之后
lark-cli auth login --device-code OaLxD_pLJum_l0D15GvZjXUw...
授權(quán)成功后會顯示用戶名和請求的 scopes
OK: 授權(quán)成功! 用戶: 用戶682480 (ou_0270e075d164d1807b696711f82fdddc) 本次請求 scopes: calendar:calendar.event:create calendar:calendar:read ...
用 lark-cli auth status 可以驗(yàn)證授權(quán)狀態(tài),確認(rèn) user 身份的 status: ready 和 tokenStatus: valid 就對了。
用 lark-cli calendar +agenda --as user 測試一下個人日程訪問,返回 ok: true, identity: user 就說明搞定了。
每個 Profile 還有自己獨(dú)立的 lark-cli 配置,路徑在 ~/.hermes/profiles/<profile>/home/.lark-cli/hermes/config.json。里面的關(guān)鍵是 defaultAs: user 這個字段,它確保 Profile 的 Agent 執(zhí)行 lark-cli 命令時默認(rèn)以用戶身份操作,日程就會創(chuàng)建到你的個人日歷上而不是應(yīng)用日歷。
說到這個,有個很實(shí)用的技巧。你可以在 coder Profile 的記憶體系里寫入工具使用規(guī)則
# ~/.hermes/profiles/coder/memories/MEMORY.md 用戶已配置飛書 CLI (lark-cli) 并使用 User 授權(quán)。 創(chuàng)建、查看、修改日程必須使用 `lark-cli calendar` 命令系列,而不是 `feishu_calendar_*` 工具。 默認(rèn)操作日歷應(yīng)為用戶個人日歷 (`primary`)。
Hermes 的記憶體系會在每次新會話開始時注入到系統(tǒng)提示中,Agent 會遵循里面記錄的規(guī)則。寫入這段話之后,coder Profile 的 Agent 后續(xù)就會自動選擇 lark-cli calendar 來操作日程。
這個思路其實(shí)可以推廣到所有需要「教」Profile 正確行為的場景。你通過 MEMORY.md 持久化地告訴 Agent 該用什么工具、該怎么用,比每次在對話里糾正要高效得多。
Bot 身份 vs User 身份
這塊容易搞混,我整理了一個對比表
| 維度 | Bot 身份 (tenant_access_token) | User 身份 (user_access_token) |
|---|---|---|
| 獲取方式 | appId + appSecret | OAuth 用戶掃碼授權(quán) |
| 消息收發(fā) | ? Gateway 收發(fā)飛書消息 | ? 不適合用于消息收發(fā) |
| 個人日歷 | ? 只能看到 bot 自己的日歷 | ? 可以查看和管理個人日歷 |
| 云盤/文檔 | ? 只能訪問應(yīng)用相關(guān)資源 | ? 可以訪問用戶個人資源 |
| 消息發(fā)送身份 | 以應(yīng)用名義發(fā)送 | 以用戶名義發(fā)送 |
| 適合場景 | 機(jī)器人聊天、卡片更新 | 操作個人資源(日程、文檔、云盤) |
最佳實(shí)踐就是,Gateway 消息收發(fā)用 bot 身份,操作用戶個人資源用 user 身份。兩者各司其職,不要混著用。
持久化服務(wù)
如果你希望 gateway 在后臺持續(xù)運(yùn)行,重啟后自動恢復(fù),可以把它安裝為系統(tǒng)服務(wù)
coder gateway install # 創(chuàng)建 systemd 服務(wù) coder gateway start # 啟動服務(wù)
每個 Profile 的服務(wù)名是獨(dú)立的
- 默認(rèn) Profile 是
hermes-gateway.service - coder Profile 是
hermes-gateway-coder.service - research Profile 是
hermes-gateway-research.service
它們互不影響,可以獨(dú)立啟停。
在 WSL2 里用 systemd 需要注意,確保 /etc/wsl.conf 里配置了 systemd=true,否則服務(wù)會在 WSL 重啟后丟失。
批量管理
Profile 多了之后,逐個啟停很麻煩??梢詫憘€腳本來批量管理
#!/bin/sh
profiles="default coder research writer"
for profile in $profiles; do
if [ "$profile" = "default" ]; then
hermes gateway "$1"
else
hermes -p "$profile" gateway "$1"
fi
done
保存為 hermes-gateways,加上執(zhí)行權(quán)限
chmod +x hermes-gateways ./hermes-gateways start # 啟動所有 Profile ./hermes-gateways stop # 停止所有 Profile ./hermes-gateways restart # 重啟所有 Profile
我自己把這個腳本放在 ~/.local/bin/ 里,用起來很方便。
查看日志和狀態(tài)
多 Profile 運(yùn)行的時候,排查問題需要看日志。每個 Profile 的日志在自己的目錄下
# 默認(rèn) Profile tail -f ~/.hermes/logs/gateway.log # coder Profile tail -f ~/.hermes/profiles/coder/logs/gateway.log
想同時看所有 Profile 的日志
tail -f ~/.hermes/logs/gateway.log ~/.hermes/profiles/*/logs/gateway.log
查看 Profile 狀態(tài)
hermes profile list # 列出所有 Profile 及其狀態(tài)
這個命令會顯示每個 Profile 的模型、gateway 運(yùn)行狀態(tài)、最后活躍時間。
更新和維護(hù)
hermes update 會拉取最新代碼,并自動同步新 bundled skills 到所有 Profile
hermes update # → Code updated (12 commits) # → Skills synced: default (up to date), coder (+2 new), research (+2 new)
用戶修改過的 skills 不會被覆蓋,只有 bundled skills 會同步。
更新完之后重啟所有 gateway
./hermes-gateways restart
踩坑記錄
說到這個,我分享幾個自己踩過的坑。
坑一,工作目錄混淆
一開始我以為 Profile 目錄就是工作目錄,結(jié)果發(fā)現(xiàn) agent 執(zhí)行命令的時候還是在 ~ 下。后來才搞明白,Profile 目錄是 Hermes 的狀態(tài)目錄,工作目錄由 terminal.cwd 控制。
如果你希望某個 Profile 默認(rèn)在特定項(xiàng)目目錄下工作,需要顯式設(shè)置
coder config set terminal.cwd /absolute/path/to/project
注意必須是絕對路徑,cwd: "." 在 local backend 下表示「Hermes 啟動時的目錄」,不是 Profile 目錄。
坑二,Token 沖突
前面提到過,兩個 Profile 用了同一個 bot token,第二個 gateway 會拒絕啟動。排查方法
grep -H 'TELEGRAM_BOT_TOKEN\|DISCORD_BOT_TOKEN' \
~/.hermes/.env ~/.hermes/profiles/*/.env
這個命令會列出所有 Profile 的 token,一眼就能看出哪個重復(fù)了。
坑三,WSL2 下服務(wù)丟失
WSL2 重啟后 systemd 服務(wù)沒了。原因是 /etc/wsl.conf 里沒有配置 systemd=true。
解決方法
sudo nano /etc/wsl.conf
添加
[boot] systemd=true
然后在 PowerShell 里重啟 WSL
wsl --shutdown
重新進(jìn)入 WSL 后,systemd 服務(wù)就會自動恢復(fù)。
坑四,invalid_client 授權(quán)失敗
OAuth 授權(quán)的時候遇到 invalid_client: The client secret is invalid 錯誤,折騰了好一陣。
根因是 lark-cli config bind 的時候把 appSecret 存進(jìn)了 keychain。如果你 bind 的時候 appSecret 是個占位符,比如 YOUR_SCHEDULE_APP_SECRET,后來在 Profile 的 .env 里改了真實(shí)值,keychain 里的并不會自動更新。
解決方法是把舊的清掉重新來一遍
# 1. 確認(rèn) Profile 的 .env 里是真實(shí)的 appSecret grep FEISHU_APP_SECRET ~/.hermes/profiles/coder/.env # 2. 清除舊配置 lark-cli config remove # 3. 重新綁定 lark-cli config bind --source hermes --identity user-default --force # 4. 重新發(fā)起 OAuth lark-cli auth login --domain calendar --no-wait --json
坑五,日程創(chuàng)建了但日歷里看不到
Agent 調(diào)用 feishu_calendar_create_event 返回成功了,但用戶個人日歷里就是沒有那條日程。
這個問題前面其實(shí)已經(jīng)說過了,內(nèi)置工具用的是應(yīng)用身份,日程被創(chuàng)建到了飛書應(yīng)用的日歷上。短期方案是讓 Agent 用 lark-cli calendar +create --as user 代替內(nèi)置工具,長期方案是改造 feishu_calendar_tool.py 支持 OAuth user_access_token,不過這個工作量比較大。
坑六,流式卡片不更新
遇到卡片沒有流式更新的時候,按這個順序排查
# 1. 檢查 streaming 配置 grep -A2 "streaming:" ~/.hermes/config.yaml # 應(yīng)為 enabled: true, transport: edit # 2. 檢查 doctor 狀態(tài) python3 -m hermes_feishu_card.cli doctor --hermes-dir ~/.hermes/hermes-agent --explain # 3. 檢查 sidecar 狀態(tài) python3 -m hermes_feishu_card.cli status --config ~/.hermes_feishu_card/config.yaml # 4. 檢查 hook 策略 # doctor 應(yīng)顯示 hook_strategy: gateway_run_013_plus
大部分情況下是 sidecar 沒啟動或者 streaming 配置沒寫對。
快速參考
最后整理一份命令速查表,方便日常使用
# 流式卡片 Sidecar python3 -m hermes_feishu_card.cli start --config ~/.hermes_feishu_card/config.yaml python3 -m hermes_feishu_card.cli stop --config ~/.hermes_feishu_card/config.yaml python3 -m hermes_feishu_card.cli status --config ~/.hermes_feishu_card/config.yaml # Lark-CLI lark-cli config bind --source hermes --identity user-default --force lark-cli auth login --domain calendar --no-wait --json lark-cli auth login --device-code <device_code> lark-cli auth status lark-cli calendar +agenda --as user # Profile 專屬路徑 ~/.hermes/profiles/<name>/.env ~/.hermes/profiles/<name>/config.yaml ~/.hermes/profiles/<name>/home/.lark-cli/hermes/config.json # 全局配置 ~/.hermes/config.yaml
總結(jié)
回過頭來看,Hermes 的 Profile 機(jī)制設(shè)計(jì)得真的很優(yōu)雅。
它不是簡單地在同一個 agent 里加個「角色切換」功能,而是從底層就做了完全隔離。每個 Profile 是一個獨(dú)立的 agent,有自己的狀態(tài)、配置、記憶、技能樹。這種設(shè)計(jì)雖然占用更多磁盤空間,但換來了真正的隔離性和靈活性。
多 Profile 協(xié)作的 Kanban 機(jī)制也很有想象力。把任務(wù)拆解、分配、追蹤這些項(xiàng)目管理概念引入到 AI agent 體系里,讓多個 agent 能像一個團(tuán)隊(duì)一樣協(xié)作。
接入聊天平臺這塊,單 Profile 對應(yīng)單 bot 的設(shè)計(jì)很直觀,多 Profile 群聊的方案也很靈活。你可以根據(jù)自己的需求選擇最合適的方案。飛書接入雖然坑不少,但趟過去之后體驗(yàn)是真的好,尤其是流式卡片加上用戶身份授權(quán)都配好之后,Agent 幫你管理日程的感覺就很順暢了。
如果你也在折騰 AI agent,強(qiáng)烈推薦試試 Profile 機(jī)制。它能讓你的 agent 體系從「單兵作戰(zhàn)」升級到「團(tuán)隊(duì)協(xié)作」,打開很多新的可能性。
到此這篇關(guān)于Hermes Agent中多Profile實(shí)戰(zhàn)小結(jié)的文章就介紹到這了,更多相關(guān)Hermes Agent 多Profile 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

Hermes Agent 全棧安裝、配置與Web端架構(gòu)深度解析(官方命令版·最終優(yōu)化)
本文給大家介紹Hermes Agent 全棧安裝、配置與Web端架構(gòu)深度解析,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2026-07-16
本文主要介紹了深入理解Hermes Agent Skill 機(jī)制,包含發(fā)現(xiàn)索引→觸發(fā)加載→預(yù)處理→Prompt注入→LLM響應(yīng)五個階段,下面就詳細(xì)了解這五種階段,感興趣的可以了解一下2026-07-16
Hermes Agent 的 CLI 并非一個簡單的命令行包裝器,而是一個完整的終端用戶界面,掌握 CLI 的全部交互細(xì)節(jié),你才能讓智能體在終端里真正"跑起來",本文主要介紹2026-07-15
Hermes Agent開發(fā)了一套智能上下文壓縮系統(tǒng),專門解決長對話場景下的上下文窗口限制問題,本文就來詳細(xì)的介紹一下Hermes Agent 上下文壓縮機(jī)制,感興趣的 可以了解一下2026-07-15
Hermes Agent桌面版安裝部署完全指南(2026年最新)
本文是一份超詳細(xì)HermesAgent桌面版安裝部署指南,手把手帶你搞定Windows、macOS、Linux全平臺安裝,點(diǎn)擊獲取極速配置技巧、核心功能拆解與WevView2報(bào)錯解決方案,別錯過讓Age2026-07-14
想要一個能直接在終端里聊天的AI助手嗎,HermesAgent本地命令行工具可以幫你連接多種大模型、執(zhí)行終端命令、分析文件,甚至寫代碼,立即掌握核心命令和配置技巧,提升你的工作2026-07-13
在Hermes Agent里搭建全中文 Honcho 記憶系統(tǒng)踩過的坑
我的Hermes Agent配置了多個 profile,記憶系統(tǒng)選擇了基于 Honcho,但是Honcho的提示詞是英文的,它的API服務(wù)也是英文環(huán)境,我需要全中文流程,下面就來介紹一下搭建全中文 Ho2026-07-13
Hermes Agent 架構(gòu)設(shè)計(jì)與目錄結(jié)構(gòu)解析
Hermes Agent 是由 Nous Research 推出的開源自進(jìn)化 AI 智能體框架,其核心架構(gòu)采用分層模塊化設(shè)計(jì),強(qiáng)調(diào)“執(zhí)行—提煉—沉淀—自省”的閉環(huán)學(xué)習(xí)機(jī)制,以下從總體架構(gòu)、核心2026-07-08
Hermes Agent 從部署到項(xiàng)目實(shí)戰(zhàn)完整操作指南
本文詳細(xì)介紹了龍蝦桌面助手Hermes 客戶端從安裝到配置,以及常用的場景演示,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,2026-07-07
從環(huán)境準(zhǔn)備到網(wǎng)關(guān)啟動,Hermes Agent的安裝每一步都可能報(bào)錯,本文將手把手幫你解決WSL2安裝失敗、Node.js版本沖突、API 502錯誤等核心問題,讓你少走彎路,快速搞定開發(fā)環(huán)境2026-07-07









