mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-30 01:41:43 +00:00
feat(gateway/slack): support channel_skill_bindings
Extends the existing channel_skill_bindings mechanism (previously
Discord-only) to Slack, so a channel or DM can auto-load one or more
skills at session start without relying on the model's skill selector
for every short reply.
Motivation: Mats's German flashcards DM pushes a cron-driven card
5x/day; he responds with one-word guesses like 'work'. Previously each
reply required the main agent to decide whether to load german-flashcards
(full opus turn just to pick a skill). With the binding configured per
Slack channel, the skill is injected at session start and grading runs
directly.
Changes:
- Extract resolve_channel_skills() from DiscordAdapter._resolve_channel_skills
into gateway.platforms.base (now shared across adapters).
- DiscordAdapter._resolve_channel_skills delegates to the shared helper
(behavior preserved — existing test suite still passes unchanged).
- SlackAdapter: resolve channel_skill_bindings on each message and attach
auto_skill to MessageEvent. gateway/run.py already handles auto-skill
injection on new sessions; this just wires Slack through it.
- gateway/config.py: accept channel_skill_bindings in slack: block of
config.yaml (was Discord-only).
- Tests: new tests/gateway/test_slack_channel_skills.py with 11 cases
covering DM/thread/parent resolution, single-vs-list skills, dedup,
malformed entries. Discord suite unchanged.
- Docs: add 'Per-Channel Skill Bindings' section to Slack user guide.
Config example:
slack:
channel_skill_bindings:
- id: "D0ATH9TQ0G6"
skills: ["german-flashcards"]
This commit is contained in:
parent
635253b918
commit
8fb861ea6e
6 changed files with 224 additions and 17 deletions
|
|
@ -510,6 +510,34 @@ slack:
|
|||
|
||||
Keys are Slack channel IDs (find them via channel details → "About" → scroll to bottom). All messages in the matching channel get the prompt injected as an ephemeral system instruction.
|
||||
|
||||
## Per-Channel Skill Bindings
|
||||
|
||||
Auto-load a skill whenever a new session starts in a specific channel or DM. Unlike per-channel prompts (which are injected on every turn), skill bindings inject the skill content as a user message at **session start** — it becomes part of the conversation history and does not need to be reloaded on subsequent turns.
|
||||
|
||||
This is ideal for DMs or channels with a dedicated purpose (flashcards, a domain-specific Q&A bot, a support triage channel, etc.) where you don't want the model's own skill selector to decide whether to load on every short reply.
|
||||
|
||||
```yaml
|
||||
slack:
|
||||
channel_skill_bindings:
|
||||
# DM channel — always runs in "german-flashcards" mode
|
||||
- id: "D0ATH9TQ0G6"
|
||||
skills:
|
||||
- german-flashcards
|
||||
# Research channel — preload multiple skills in order
|
||||
- id: "C01RESEARCH"
|
||||
skills:
|
||||
- arxiv
|
||||
- writing-plans
|
||||
# Short form: single skill as a string
|
||||
- id: "C02SUPPORT"
|
||||
skill: hubspot-on-demand
|
||||
```
|
||||
|
||||
Notes:
|
||||
- The binding matches by channel ID. For threaded messages in a bound channel, the thread inherits the parent channel's binding.
|
||||
- The skill is loaded only at session start (new session or after auto-reset). If you change the binding, run `/new` or wait for the session to auto-reset for it to take effect.
|
||||
- Combine with `channel_prompts` for per-channel tone/constraints on top of the skill's instructions.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Problem | Solution |
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue