overmind-mcp
Version:
Orchestrateur universel agents IA multi-modeles via MCP. Inclut le protocole 'Custom-Nickname' pour identifier vos agents avec des surnoms originaux (The Chaos Prophet, Shadow Sniper, etc.), l'isolation mémoire (Private Memory Context) et le support pour
197 lines (154 loc) • 7.93 kB
Markdown
# Comment fonctionne Overmind + Hermes sniperbot_analyst
## TL;DR
Quand tu fais `!sniper` sur Discord, **3 couches de config** sont traversées
en cascade avant qu'Hermes upstream envoie la requête à `api.minimaxi.com`.
C'est un design polyglot : 1 format Overmind runner + 1 format Hermes
canonique + 1 format config globale. Pas le choix si on veut supporter
4 runners (Claude, Kilo, OpenClaw, Hermes) avec un seul format unifié.
## Le flow complet
```
[1] Discord channel <discord-channel-id>
user écrit "!sniper quel est ton model"
↓
[2] discord_llm/src/discord-bot.ts (bot Node.js Discord.js)
handleSniperCommand() → sendToClaudeServer(content, userId, ...)
POST http://localhost:3001/send {message, userId, channelId}
↓
[3] discord_llm/src/overmind-bridge.ts (serveur HTTP Express)
app.post('/send') → service.runAgentForDiscord(
'sniperbot_analyst', 'hermes', message
)
↓
[4] overmind-mcp bridge (package npm installé dans discord_llm/node_modules)
BridgeProxy → JSON-RPC 2.0 vers http://localhost:3099/mcp
méthode "run_agent" { runner: "hermes", agentName: "sniperbot_analyst", prompt }
↓
[5] Workflow/src/server.ts (MCP server sur port 3099)
tool: mcp__overmind__run_agent
→ NousHermesRunner.runAgentInternal(...)
↓
[6] Workflow/src/services/NousHermesRunner.ts (le runner)
── Phase A : Lit Workflow/.claude/settings_sniperbot_analyst.json
── Phase B : Interpole les $VAR depuis Workflow/.env
── Phase C : Détecte le provider (auto-detect v3.0)
── Phase D : Écrit ~/.overmind/hermes/profiles/sniperbot_analyst/config.yaml
── Phase E : Spawn `hermes chat -q ... --model MiniMax-M3 --provider minimax-cn`
avec HERMES_HOME=Workflow/.overmind/hermes/
↓
[7] Hermes upstream (binaire `hermes` v0.16.0+ installé via `npm i -g hermes-agent`)
Lit ~/.overmind/hermes/profiles/sniperbot_analyst/config.yaml
+ Lit ~/.overmind/hermes/profiles/sniperbot_analyst/SOUL.md
+ Charge les MCP servers de Workflow/.mcp.json
+ Construit un client OpenAI/Anthropic
↓
[8] api.minimaxi.com/anthropic (endpoint MiniMax CN)
Authorization: Bearer <MINIMAX_CN_API_KEY du settings.json>
POST /v1/messages { model: "MiniMax-M3", ... }
↓
[9] Réponse → Discord (réponse du sniperbot affichée dans le channel)
```
## Les 3 couches de config
### Couche 1 : Source Overmind runner (ce que TU édites)
**`Workflow/.claude/settings_sniperbot_analyst.json`**
Format unifié Overmind, partagé entre tous les runners. Tu mets ici :
- `env.ANTHROPIC_AUTH_TOKEN` (= `$VAR` à interpoler depuis `.env`)
- `env.ANTHROPIC_BASE_URL` (= endpoint API)
- `env.ANTHROPIC_MODEL`
- `enableAllProjectMcpServers: true|false`
- `enabledMcpjsonServers: [...]` (noms des MCP servers à charger)
- `agent`, `runner`
### Couche 2 : Settings canonique Hermes (auto-généré)
**`~/.overmind/hermes/profiles/sniperbot_analyst/config.yaml`**
Format canonique qu'Hermes upstream attend. Le runner l'écrit à chaque spawn.
Contient **en plus** du source :
- `MINIMAX_CN_API_KEY` (= valeur du token, seedée par la subtilisation)
- `MINIMAX_CN_BASE_URL` (= endpoint CN, seedé par la subtilisation)
- `runner: "hermes"` (forcé)
- `agent: "sniperbot_analyst"` (forcé)
### Couche 3 : Config globale Hermes (gérée par Hermes upstream)
**`Workflow/.overmind/hermes/config.yaml`** + **`auth.json`**
Hermes upstream écrit/lit ces fichiers pour :
- Modèle par défaut global
- Pool de credentials (par provider : `minimax-cn`, `zai`, `openrouter`, `qwen-oauth`)
- État des credentials (`last_status: ok` / `exhausted`)
**On ne touche JAMAIS** à ces fichiers depuis le runner.
## Les subtilisations du runner (v3.0+)
Quand le runner écrit le settings.json canonique, il **injecte** des env vars
spécifiques au provider détecté, basées sur :
| Token prefix | URL contient | → seed |
|---|---|---|
| `sk-cp-*` ou `sk-mm-*` | `minimaxi` (avec le `i`) | `MINIMAX_CN_API_KEY` + `MINIMAX_CN_BASE_URL=https://api.minimaxi.com/anthropic` |
| `sk-cp-*` ou `sk-mm-*` | `minimax` (sans le `i`) | `MINIMAX_API_KEY` + `MINIMAX_BASE_URL=https://api.minimax.io/anthropic` |
| `sk-cp-*` ou `sk-mm-*` | vide | `MINIMAX_CN_*` (défaut `OVERMIND_MINIMAX_DEFAULT=cn`) |
| 32hex ou 32hex.32hex | n/a | `ZAI_ANTHROPIC_FALLBACK_KEY` + `GLM_API_KEY` |
| autre `sk-*` | n/a | rien de plus (laisser `ANTHROPIC_AUTH_TOKEN` comme fallback) |
**Tu n'as qu'à mettre `ANTHROPIC_AUTH_TOKEN` + `ANTHROPIC_BASE_URL` dans le
source settings — le runner fait le mapping pour toi.**
## Les fichiers à connaître
```
Workflow/
├── .claude/
│ ├── settings_sniperbot_analyst.json ← COUCHE 1 : source (tu édites)
│ ├── agents/sniperbot_analyst.md ← (legacy, ignoré par Hermes runner)
│ └── .mcp.json ← (legacy, ignoré par Hermes runner)
├── .mcp.json ← registry MCP servers HTTP
├── .env ← tokens + secrets
├── .overmind/hermes/ ← HERMES_HOME (root canonique)
│ ├── agents/sniperbot_analyst/ ← COUCHE 2 : auto-généré
│ │ ├── settings.json ← écrit par le runner
│ │ ├── SOUL.md ← persona
│ │ ├── sessions/ logs/ memories/ ← Hermes upstream écrit
│ ├── config.yaml ← COUCHE 3 : Hermes global
│ ├── auth.json ← COUCHE 3 : credential pool
│ ├── sessions/ logs/ ← partagés entre agents
├── src/services/NousHermesRunner.ts ← le runner (Overmind)
discord_llm/
├── src/discord-bot.ts ← le bot Discord (!sniper)
├── src/overmind-bridge.ts ← le bridge HTTP port 3001
└── node_modules/overmind-mcp/ ← package npm installé
```
## Pourquoi 3 couches (et pas 1)
- **Format Overmind unifié** (`.claude/settings_<name>.json`) = portable entre
4 runners (Claude, Kilo, OpenClaw, Hermes). C'est l'API publique Overmind.
- **Format Hermes canonique** (`agents/<name>/settings.json`) = ce que le
binaire `hermes` upstream lit. A des champs spécifiques aux plugins
(`MINIMAX_CN_API_KEY`, etc.) que seul le runner connaît.
- **Config globale Hermes** (`config.yaml`, `auth.json`) = état partagé entre
tous les agents (credential pool, modèle par défaut, etc.). Géré par Hermes
upstream — on n'y touche pas.
**Si tu veux 100% Hermes natif** (sans Overmind), utilise directement
`hermes chat -q "..." --yolo` (le `.bat` launcher qui marche, vu au début).
Mais tu perds :
- L'orchestration multi-agents
- Le swap auto de tokens sur 401/429/5xx
- L'unification Claude/Kilo/OpenClaw/Hermes
## Pour invoquer directement (test)
```
mcp__overmind__run_agent({
agentName: "sniperbot_analyst",
runner: "hermes",
prompt: "ping"
})
```
Le runner fait : load source → interpolate → detect provider → write canonique
→ spawn hermes → return result.
## Pour invoquer via Discord
```
!sniper ping
```
Le bot Discord → bridge HTTP port 3001 → MCP server port 3099 → runner
→ hermes → api.minimaxi.com → Discord reply.
## Testé et fonctionnel (2026-06-07, 17:25)
- `mcp__overmind__run_agent(agentName="sniperbot_analyst", runner="hermes", prompt="ping")`
→ `"OK"` ✅
- `provider=minimax-cn, base_url=https://api.minimaxi.com/anthropic, model=MiniMax-M3` ✅
- `MINIMAX_CN_API_KEY` et `MINIMAX_CN_BASE_URL` auto-seedées ✅
- Token `$ANTHROPIC_AUTH_TOKEN_1` (interpolé depuis `.env`) ✅
- `enableAllProjectMcpServers: true` → 9 MCP servers chargés ✅