H繁中版
<!-- Source: https://hermesbible.com/docs/user-guide/messaging/teams -->

Section: Messaging Platforms · URL: https://hermesbible.com/docs/user-guide/messaging/teams

Microsoft Teams 設定

將 Hermes Agent 連接為 Microsoft Teams 的機器人。與 Slack 的 Socket Mode 不同,Teams 透過呼叫公開的 HTTPS Webhook 來傳遞訊息,因此你的實例需要一個公開可達的端點 — 可以是開發用的 Tunnel(本地開發)或正式網域(正式環境)。

需要從 Microsoft Graph 事件取得會議摘要,而非一般的機器人對話嗎?請使用專屬的設定頁面:Teams Meetings

執行 hermes gateway setup 並選擇 Microsoft Teams 以進行引導設定。

機器人回應方式

情境行為
私人對話 (DM)機器人會回覆每則訊息,無需 @mention。
群組對話機器人僅在被 @mention 時回應。
頻道機器人僅在被 @mention 時回應。

Teams 會將 @mention 以 <at>BotName</at> 標籤的普通訊息形式傳遞,Hermes 會在處理前自動將其移除。


對於原始碼安裝或本地安裝,需要包含 Teams extra 以便內建的 Adapter 能夠匯入 Microsoft Teams SDK:

uv sync --extra teams
# 或使用可編輯安裝:
uv pip install -e ".[teams]"

步驟 1:安裝 Teams CLI

@microsoft/teams.cli 可自動完成機器人註冊 — 不需要進入 Azure 入口網站。

npm install -g @microsoft/teams.cli@preview
teams login

如需驗證登入狀態並取得自己的 AAD Object ID(用於 TEAMS_ALLOWED_USERS):

teams status --verbose

步驟 2:公開 Webhook 連接埠

Teams 無法將訊息傳遞到 localhost。進行本地開發時,請使用任何 Tunnel 工具取得公開的 HTTPS URL。預設連接埠為 3978 — 如需變更可使用 TEAMS_PORT

# devtunnel (Microsoft)
devtunnel create hermes-bot --allow-anonymous
devtunnel port create hermes-bot -p 3978 --protocol https  # 若已變更,請將 3978 替換為 TEAMS_PORT
devtunnel host hermes-bot

# ngrok
ngrok http 3978  # 若已變更,請將 3978 替換為 TEAMS_PORT

# cloudflared
cloudflared tunnel --url http://localhost:3978  # 若已變更,請將 3978 替換為 TEAMS_PORT

從輸出中複製 https:// URL — 你將在下一步使用它。開發期間請保持 Tunnel 運作。

在正式環境中,請將機器人的端點指向伺服器的公開網域(參見正式環境部署)。


步驟 3:建立機器人

teams app create \
  --name "Hermes" \
  --endpoint "https://<your-tunnel-url>/api/messages"

CLI 會輸出你的 CLIENT_IDCLIENT_SECRETTENANT_ID,以及用於步驟 6 的安裝連結。請妥善保存 Client Secret — 它不會再次顯示。


步驟 4:設定環境變數

新增至 ~/.hermes/.env

# 必要
TEAMS_CLIENT_ID=<your-client-id>
TEAMS_CLIENT_SECRET=<your-client-secret>
TEAMS_TENANT_ID=<your-tenant-id>

# 限制特定使用者存取(建議)
# 使用 `teams status --verbose` 取得的 AAD Object ID
TEAMS_ALLOWED_USERS=<your-aad-object-id>

步驟 5:啟動 Gateway

HERMES_UID=$(id -u) HERMES_GID=$(id -g) docker compose up -d gateway

這會啟動 Gateway。預設 Webhook 連接埠為 3978(可透過 TEAMS_PORT 覆蓋)。確認它正在運作:

curl http://localhost:3978/health   # 應回傳:ok
docker logs -f hermes

尋找以下訊息:

[teams] Webhook server listening on 0.0.0.0:3978/api/messages

步驟 6:在 Teams 中安裝 App

teams app get <teamsAppId> --install-link

在瀏覽器中開啟輸出的連結 — 它會直接在 Teams 用戶端中開啟。安裝完成後,向你的機器人發送一則私人訊息 — 即可開始使用。


設定參考

環境變數

變數說明
TEAMS_CLIENT_IDAzure AD App (Client) ID
TEAMS_CLIENT_SECRETAzure AD Client Secret
TEAMS_TENANT_IDAzure AD Tenant ID
TEAMS_ALLOWED_USERS以逗號分隔的 AAD Object ID,允許使用機器人的使用者
TEAMS_ALLOW_ALL_USERS設定為 true 可跳過允許清單,允許任何人使用
TEAMS_HOME_CHANNEL用於 Cron/主動訊息傳遞的對話 ID
TEAMS_HOME_CHANNEL_NAME主頻道的顯示名稱
TEAMS_PORTWebhook 連接埠(預設:3978

config.yaml

也可以透過 ~/.hermes/config.yaml 進行設定:

platforms:
  teams:
    enabled: true
    extra:
      client_id: "your-client-id"
      client_secret: "your-secret"
      tenant_id: "your-tenant-id"
      port: 3978

功能

互動式審批卡片

當 Agent 需要執行 potentially dangerous 命令時,它會傳送一張包含四個按鈕的 Adaptive Card,而非要求你輸入 /approve

  • Allow Once — 允許此次特定命令
  • Allow Session — 在本次對話剩餘時間內允許此模式
  • Always Allow — 永久允許此模式
  • Deny — 拒絕該命令

點擊按鈕即可直接完成審批,卡片會被替換為決策結果。

會議摘要傳遞 (Teams Meeting Pipeline)

當啟用 Teams meeting pipeline 外掛 時,此 Adapter 也負責會議摘要的外送傳遞 — 同一個 Teams 整合介面,而非兩個。會議逐字稿完成摘要後,撰寫者會將摘要發佈到你指定的 Teams 目標。

Pipeline 摘要傳遞設定位於 teams 平台設定項下,與機器人設定並列:

platforms:
  teams:
    enabled: true
    extra:
      # 現有的機器人設定 (client_id, client_secret, tenant_id, port) ...

      # 會議摘要傳遞(僅在 teams_pipeline 外掛啟用時使用)
      delivery_mode: "graph"       # 或 "incoming_webhook"
      # delivery_mode: graph — 選擇以下其中之一:
      chat_id: "19:meeting_..."    # 發佈到 Teams 對話
      # team_id: "..."             # 或發佈到頻道
      # channel_id: "..."
      # access_token: "..."        # 選用;若未設定則使用 MSGRAPH_* App 憑證
      # delivery_mode: incoming_webhook:
      # incoming_webhook_url: "https://outlook.office.com/webhook/..."
模式適用情境取捨
incoming_webhook簡單的「將摘要發佈到此頻道」,使用 Teams 產生的靜態 URL。無回覆串、無表情回應、以 Webhook 設定的身份顯示。
graph透過 Microsoft Graph 以機器人身份進行有串的頻道發佈或 1:1/群組對話發佈。需要 Graph App 註冊,並具備 ChannelMessage.Send(頻道)或 Chat.ReadWrite.All(對話)應用程式權限。

如果 啟用 teams_pipeline 外掛,這些設定不會生效 — 僅在 Pipeline 運行時綁定到 Graph Webhook 入口時才會啟用。


正式環境部署

對於永久性伺服器,跳過 devtunnel,使用伺服器的公開 HTTPS 端點註冊你的機器人:

teams app create \
  --name "Hermes" \
  --endpoint "https://your-domain.com/api/messages"

如果已經建立機器人,只需要更新端點:

teams app update --id <teamsAppId> --endpoint "https://your-domain.com/api/messages"

確保你設定的連接埠(TEAMS_PORT,預設 3978)可從網際網路存取,且 TLS 憑證有效 — Teams 會拒絕自簽憑證。


疑難排解

問題解決方案
health 端點正常但機器人不回應確認 Tunnel 仍在運作,且機器人的訊息端點與 Tunnel URL 相符
日誌中出現 KeyError: 'teams'重啟容器 — 此問題已在現行版本中修正
機器人回傳認證錯誤確認 TEAMS_CLIENT_IDTEAMS_CLIENT_SECRETTEAMS_TENANT_ID 均已正確設定
No inference provider configured檢查 ~/.hermes/.env 中是否設定了 ANTHROPIC_API_KEY(或其他 Provider 金鑰)
機器人收到訊息但忽略它們你的 AAD Object ID 可能不在 TEAMS_ALLOWED_USERS 中。執行 teams status --verbose 查找
Tunnel URL 在重啟後改變devtunnel 使用命名 Tunnel(devtunnel create hermes-bot)時 URL 為持久性。ngrok 和 cloudflared 每次執行都會產生新 URL(除非使用付費方案)— 當 URL 改變時使用 teams app update 更新機器人端點
Teams 顯示「This bot is not responding」Webhook 回傳了錯誤。查看 docker logs hermes 取得錯誤追蹤
日誌中出現 [teams] Failed to connectSDK 認證失敗。再次確認你的憑證,以及 Tenant ID 是否與 teams login 時使用的帳號相符

安全性

WARNING

務必設定 TEAMS_ALLOWED_USERS,使用已授權使用者的 AAD Object ID。若未設定,任何能找到或安裝你機器人的人都能與其互動。

TEAMS_CLIENT_SECRET 視為密碼 — 定期透過 Azure 入口網站或 Teams CLI 進行輪替。

  • 將憑證存放在 ~/.hermes/.env,權限設為 600chmod 600 ~/.hermes/.env
  • 機器人僅接受 TEAMS_ALLOWED_USERS 中使用者的訊息;未授權的訊息會被靜默丟棄
  • 你的公開端點(/api/messages)由 Teams Bot Framework 進行認證 — 未攜帶有效 JWT 的請求會被拒絕

相關文件



WeCom 回呼(自建 App)