mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-20 05:01:30 +00:00
Cross-checked 75 docs pages under user-guide/messaging/, developer-guide/,
guides/, and integrations/ against the live registries and gateway code.
messaging/
- index.md: API Server toolset is hermes-api-server (was 'hermes (default)');
Google Chat slug is hermes-google_chat (underscore — plugin name uses _).
- google_chat.md: drop bogus 'pip install hermes-agent[google_chat]' (no such
extra); list the actual deps (google-cloud-pubsub, google-api-python-client,
google-auth, google-auth-oauthlib).
- qqbot.md: config namespace is platforms.qqbot (was platforms.qq, which is
silently ignored by the adapter); QQ_STT_BASE_URL is not read directly —
baseUrl lives under platforms.qqbot.extra.stt.
- teams-meetings.md: 'hermes teams-pipeline' is plugin-gated (teams_pipeline
plugin must be enabled), not a built-in subcommand.
- sms.md: example log line 0.0.0.0:8080 -> 127.0.0.1:8080 (default
SMS_WEBHOOK_HOST).
- open-webui.md: API_SERVER_* are env vars, not YAML keys — write them to
per-profile .env, not 'hermes config set' (same pattern fixed in
api-server.md last round). Also bumped example ports to 8650+ to dodge the
default webhook (8644)/wecom-callback (8645)/msgraph-webhook (8646)
collision.
developer-guide/
- architecture.md: tool/toolset counts (61/52 -> 70+/~28); LOC stamps for
run_agent.py, cli.py, hermes_cli/main.py, setup.py, mcp_tool.py,
gateway/run.py replaced with 'large file' to stop drifting.
- agent-loop.md: same LOC drift (~13,700 -> 'a large file (15k+ lines)').
- gateway-internals.md: '14+ external messaging platforms' -> '20+'; gateway
platform tree updated (qqbot is a sub-package, not qqbot.py; added
yuanbao.py, feishu_comment.py, msgraph_webhook.py); 'gateway/builtin_hooks/
(always active)' was wrong — it's an empty extension point and
_register_builtin_hooks() is a no-op stub.
- acp-internals.md: drop fictional 'message_callback' from the bridged-
callbacks list; clarify thinking_callback is currently set to None.
- provider-runtime.md: provider list was missing AWS Bedrock, Azure Foundry,
NVIDIA NIM, xAI, Arcee, GMI Cloud, StepFun, Qwen OAuth, Xiaomi, Ollama
Cloud, LM Studio, Tencent TokenHub. Fallback section described only the
legacy single-pair model — corrected to the canonical list-form
fallback_providers chain.
- environments.md: parsers list missing llama4_json and the deepseek_v31
alias; both register via @register_parser.
- browser-supervisor.md: drop reference to scripts/browser_supervisor_e2e.py
which doesn't exist in-repo.
- contributing.md: tinker-atropos is a git submodule — note that
'git submodule update --init' is required if cloning without
--recurse-submodules.
guides/
- operate-teams-meeting-pipeline.md: cron flags were all wrong — schedule is
positional (not --schedule), the script-only flag is --no-agent (not
--script-only), and there's no --command flag. Replaced with a real example
that creates the script under ~/.hermes/scripts/ and uses the actual flags.
Also replaced fictional 'hermes cron show <name>' with 'hermes cron status'.
- automation-templates.md: 'cron create --skills "a,b"' doesn't work —
the flag is --skill (singular, repeatable). Fixed all 5 occurrences via AST
rewrite.
- minimax-oauth.md: 'hermes auth add minimax-oauth --region cn' silently
fails because --region isn't registered on the auth-add argparse spec.
Pointed users at the minimax-cn provider (or MINIMAX_CN_API_KEY env) for
China-region access.
- cron-script-only.md: 'hermes send' is fictional — replaced the comparison-
table mention with a webhook-subscription pointer; also fixed the dead link
to /guides/pipe-script-output (page doesn't exist).
- cron-troubleshooting.md: 'hermes serve' isn't a real subcommand. Pointed
at 'hermes gateway' (foreground) / 'hermes gateway start' (service).
- local-ollama-setup.md: 'agent.api_timeout' is not a config key. The right
knob is the HERMES_API_TIMEOUT env var.
- python-library.md: run_conversation() return dict has only final_response
and messages — task_id is stored on the agent instance, not echoed back.
- use-mcp-with-hermes.md: '--args /c "npx -y …"' wraps the npx command in
one quoted string, so cmd.exe gets a single arg instead of the multi-token
command line it needs. Removed the surrounding quotes — argparse nargs='*'
collects each token correctly.
integrations/
- providers.md: Bedrock guardrail YAML keys were 'id'/'version' (don't exist);
actual keys are guardrail_identifier/guardrail_version (matches DEFAULT_CONFIG
and the run_agent.py reader). GMI default base URL (api.gmi.ai/v1 ->
api.gmi-serving.com/v1) and portal URL (inference.gmi.ai -> www.gmicloud.ai)
refreshed. Fallback section rewritten to lead with the canonical
fallback_providers list form (was leading with the legacy fallback_model
single dict); supported-providers list extended to include azure-foundry,
alibaba-coding-plan, lmstudio.
index.md
- '68 built-in tools' -> '70+'; '15+ platforms' was both inconsistent with
integrations/index.md ('19+') and undercounted — bumped to 20+ and added
Weixin/QQ Bot/Yuanbao/Google Chat to the list.
Validation: 'npm run build' clean (exit 0); broken-link count unchanged at
155 (same as round-1 post-skill-regen baseline). 24 files, +132/-89.
233 lines
7.4 KiB
Markdown
233 lines
7.4 KiB
Markdown
---
|
|
sidebar_position: 6
|
|
title: "Teams Meetings"
|
|
description: "Set up the Microsoft Teams meeting summary pipeline with Microsoft Graph webhooks"
|
|
---
|
|
|
|
# Microsoft Teams Meetings
|
|
|
|
Use the Teams meeting pipeline when you want Hermes to ingest Microsoft Graph meeting events, fetch transcripts first, fall back to recordings plus STT when needed, and deliver a structured summary to downstream sinks.
|
|
|
|
This page focuses on setup and enablement:
|
|
- Graph credentials
|
|
- webhook listener configuration
|
|
- Teams delivery modes
|
|
- pipeline config shape
|
|
|
|
For day-2 operations, go-live checks, and the operator worksheet, use the dedicated guide: [Operate the Teams Meeting Pipeline](/docs/guides/operate-teams-meeting-pipeline).
|
|
|
|
## What This Feature Does
|
|
|
|
The pipeline:
|
|
1. receives Microsoft Graph webhook events
|
|
2. resolves the meeting and prefers transcript artifacts first
|
|
3. falls back to recording download plus STT when no usable transcript is available
|
|
4. stores durable job state and sink records locally
|
|
5. can write summaries to Notion, Linear, and Microsoft Teams
|
|
|
|
Operator actions stay in the CLI (the `teams-pipeline` subcommand is registered by the `teams_pipeline` plugin — enable it via `hermes plugins enable teams_pipeline` or set `plugins.enabled: [teams_pipeline]` in `config.yaml`):
|
|
|
|
```bash
|
|
hermes teams-pipeline validate
|
|
hermes teams-pipeline list
|
|
hermes teams-pipeline maintain-subscriptions
|
|
```
|
|
|
|
## Prerequisites
|
|
|
|
Before enabling the meetings pipeline, make sure you have:
|
|
|
|
- a working Hermes install
|
|
- the existing [Microsoft Teams bot setup](/docs/user-guide/messaging/teams) if you want Teams outbound delivery
|
|
- Microsoft Graph application credentials with the permissions required for the meeting resources you plan to subscribe to
|
|
- a public HTTPS URL that Microsoft Graph can call for webhook delivery
|
|
- `ffmpeg` installed if you want recording-plus-STT fallback
|
|
|
|
## Step 1: Add Microsoft Graph Credentials
|
|
|
|
Add Graph app-only credentials to `~/.hermes/.env`:
|
|
|
|
```bash
|
|
MSGRAPH_TENANT_ID=<tenant-id>
|
|
MSGRAPH_CLIENT_ID=<client-id>
|
|
MSGRAPH_CLIENT_SECRET=<client-secret>
|
|
```
|
|
|
|
These credentials are used by:
|
|
- the Graph client foundation
|
|
- subscription maintenance commands
|
|
- meeting resolution and artifact fetches
|
|
- Graph-based Teams outbound delivery when you do not provide a dedicated Teams access token
|
|
|
|
## Step 2: Enable the Graph Webhook Listener
|
|
|
|
The webhook listener is a gateway platform named `msgraph_webhook`. At minimum, enable it and set a client state value:
|
|
|
|
```bash
|
|
MSGRAPH_WEBHOOK_ENABLED=true
|
|
MSGRAPH_WEBHOOK_PORT=8646
|
|
MSGRAPH_WEBHOOK_CLIENT_STATE=<random-shared-secret>
|
|
MSGRAPH_WEBHOOK_ACCEPTED_RESOURCES=communications/onlineMeetings
|
|
```
|
|
|
|
The listener exposes:
|
|
- `/msgraph/webhook` for Graph notifications
|
|
- `/health` for a simple health check
|
|
|
|
You need to route your public HTTPS endpoint to that listener. For example, if your public domain is `https://ops.example.com`, your Graph notification URL would typically be:
|
|
|
|
```text
|
|
https://ops.example.com/msgraph/webhook
|
|
```
|
|
|
|
## Step 3: Configure Teams Delivery and Pipeline Behavior
|
|
|
|
The meeting pipeline reads its runtime config from the existing `teams` platform entry. Pipeline-specific knobs live under `teams.extra.meeting_pipeline`. Teams outbound delivery stays on the normal Teams platform config surface.
|
|
|
|
Example `~/.hermes/config.yaml`:
|
|
|
|
```yaml
|
|
platforms:
|
|
msgraph_webhook:
|
|
enabled: true
|
|
extra:
|
|
port: 8646
|
|
client_state: "replace-me"
|
|
accepted_resources:
|
|
- "communications/onlineMeetings"
|
|
|
|
teams:
|
|
enabled: true
|
|
extra:
|
|
client_id: "your-teams-client-id"
|
|
client_secret: "your-teams-client-secret"
|
|
tenant_id: "your-teams-tenant-id"
|
|
|
|
# outbound summary delivery
|
|
delivery_mode: "graph" # or incoming_webhook
|
|
team_id: "team-id"
|
|
channel_id: "channel-id"
|
|
# incoming_webhook_url: "https://..."
|
|
|
|
meeting_pipeline:
|
|
transcript_min_chars: 80
|
|
transcript_required: false
|
|
transcription_fallback: true
|
|
ffmpeg_extract_audio: true
|
|
notion:
|
|
enabled: false
|
|
linear:
|
|
enabled: false
|
|
```
|
|
|
|
## Teams Delivery Modes
|
|
|
|
The pipeline supports two Teams summary-delivery modes inside the existing Teams plugin.
|
|
|
|
### `incoming_webhook`
|
|
|
|
Use this when you want a simple webhook post into Teams without channel-message creation through Graph.
|
|
|
|
Required config:
|
|
|
|
```yaml
|
|
platforms:
|
|
teams:
|
|
enabled: true
|
|
extra:
|
|
delivery_mode: "incoming_webhook"
|
|
incoming_webhook_url: "https://..."
|
|
```
|
|
|
|
### `graph`
|
|
|
|
Use this when you want Hermes to post the summary through Microsoft Graph into a Teams chat or channel.
|
|
|
|
Supported targets:
|
|
- `chat_id`
|
|
- `team_id` + `channel_id`
|
|
- `team_id` + `home_channel` fallback for the existing Teams platform
|
|
|
|
Example:
|
|
|
|
```yaml
|
|
platforms:
|
|
teams:
|
|
enabled: true
|
|
extra:
|
|
delivery_mode: "graph"
|
|
team_id: "team-id"
|
|
channel_id: "channel-id"
|
|
```
|
|
|
|
## Step 4: Start the Gateway
|
|
|
|
Start Hermes normally after updating config:
|
|
|
|
```bash
|
|
hermes gateway run
|
|
```
|
|
|
|
Or, if you run Hermes in Docker, start the gateway the same way you already do for your deployment.
|
|
|
|
Check the listener:
|
|
|
|
```bash
|
|
curl http://localhost:8646/health
|
|
```
|
|
|
|
## Step 5: Create Graph Subscriptions
|
|
|
|
Use the plugin CLI to create and inspect subscriptions.
|
|
|
|
Examples:
|
|
|
|
```bash
|
|
hermes teams-pipeline subscribe \
|
|
--resource communications/onlineMeetings/getAllTranscripts \
|
|
--notification-url https://ops.example.com/msgraph/webhook \
|
|
--client-state "$MSGRAPH_WEBHOOK_CLIENT_STATE"
|
|
|
|
hermes teams-pipeline subscribe \
|
|
--resource communications/onlineMeetings/getAllRecordings \
|
|
--notification-url https://ops.example.com/msgraph/webhook \
|
|
--client-state "$MSGRAPH_WEBHOOK_CLIENT_STATE"
|
|
```
|
|
|
|
:::warning Graph subscriptions expire in 72 hours
|
|
|
|
Microsoft Graph caps webhook subscriptions at 72 hours and will not auto-renew them. You MUST schedule `hermes teams-pipeline maintain-subscriptions` before going live, or notifications will silently stop three days after any manual subscription creation. See [Automating subscription renewal](/docs/guides/operate-teams-meeting-pipeline#automating-subscription-renewal-required-for-production) in the operator runbook — three options (Hermes cron, systemd timer, plain crontab).
|
|
|
|
:::
|
|
|
|
For subscription maintenance and day-2 operator flows, continue with the guide: [Operate the Teams Meeting Pipeline](/docs/guides/operate-teams-meeting-pipeline).
|
|
|
|
## Validation
|
|
|
|
Run the built-in validation snapshot:
|
|
|
|
```bash
|
|
hermes teams-pipeline validate
|
|
```
|
|
|
|
Useful companion checks:
|
|
|
|
```bash
|
|
hermes teams-pipeline token-health
|
|
hermes teams-pipeline subscriptions
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
| Problem | What to check |
|
|
|---------|---------------|
|
|
| Graph webhook validation fails | Confirm the public URL is correct and reachable, and that Graph is calling the exact `/msgraph/webhook` path |
|
|
| Jobs do not appear in `hermes teams-pipeline list` | Confirm `msgraph_webhook` is enabled and that subscriptions point at the right notification URL |
|
|
| Transcript-first never succeeds | Check Graph permissions for transcript resources and whether the transcript artifact exists for that meeting |
|
|
| Recording fallback fails | Confirm `ffmpeg` is installed and the Graph app can access recording artifacts |
|
|
| Teams summary delivery fails | Re-check `delivery_mode`, target IDs, and Teams auth config |
|
|
|
|
## Related Docs
|
|
|
|
- [Microsoft Teams bot setup](/docs/user-guide/messaging/teams)
|
|
- [Operate the Teams Meeting Pipeline](/docs/guides/operate-teams-meeting-pipeline)
|