overmind-mcp 2.8.3 → 2.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mcp.json.example +20 -20
- package/README.md +143 -143
- package/bin/launch.bat +40 -0
- package/bin/launch.js +78 -0
- package/bin/launch.sh +46 -0
- package/bin/overmind-pool.mjs +248 -248
- package/bin/restart_mcp.bat +3 -0
- package/bin/start_server.bat +3 -0
- package/bin/test_mcp.bat +4 -0
- package/dist/bin/cli.js +13 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/launch.js +78 -0
- package/dist/bridge/BridgeProxy.d.ts +52 -0
- package/dist/bridge/BridgeProxy.d.ts.map +1 -0
- package/dist/bridge/BridgeProxy.js +265 -0
- package/dist/bridge/BridgeProxy.js.map +1 -0
- package/dist/bridge/OverBridgeService.d.ts +96 -0
- package/dist/bridge/OverBridgeService.d.ts.map +1 -0
- package/dist/bridge/OverBridgeService.js +334 -0
- package/dist/bridge/OverBridgeService.js.map +1 -0
- package/dist/bridge/index.d.ts +11 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +11 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/types.d.ts +132 -0
- package/dist/bridge/types.d.ts.map +1 -0
- package/dist/bridge/types.js +19 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/bridge/utils.d.ts +48 -0
- package/dist/bridge/utils.d.ts.map +1 -0
- package/dist/bridge/utils.js +128 -0
- package/dist/bridge/utils.js.map +1 -0
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +13 -5
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/envUtils.d.ts +2 -0
- package/dist/lib/envUtils.d.ts.map +1 -1
- package/dist/lib/envUtils.js +13 -2
- package/dist/lib/envUtils.js.map +1 -1
- package/dist/lib/logger.js +1 -1
- package/dist/lib/orchestration/dispatcher.d.ts.map +1 -1
- package/dist/lib/orchestration/dispatcher.js +0 -1
- package/dist/lib/orchestration/dispatcher.js.map +1 -1
- package/dist/lib/processRegistry.d.ts.map +1 -1
- package/dist/lib/processRegistry.js +34 -21
- package/dist/lib/processRegistry.js.map +1 -1
- package/dist/memory/PostgresMemoryProvider.d.ts.map +1 -1
- package/dist/memory/PostgresMemoryProvider.js +14 -3
- package/dist/memory/PostgresMemoryProvider.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/services/AgentManager.d.ts.map +1 -1
- package/dist/services/AgentManager.js +473 -97
- package/dist/services/AgentManager.js.map +1 -1
- package/dist/services/ClaudeRunner.d.ts.map +1 -1
- package/dist/services/ClaudeRunner.js.map +1 -1
- package/dist/services/GeminiRunner.d.ts +26 -2
- package/dist/services/GeminiRunner.d.ts.map +1 -1
- package/dist/services/GeminiRunner.js +146 -136
- package/dist/services/GeminiRunner.js.map +1 -1
- package/dist/services/KiloRunner.d.ts.map +1 -1
- package/dist/services/KiloRunner.js +6 -1
- package/dist/services/KiloRunner.js.map +1 -1
- package/dist/services/NousHermesRunner.d.ts +1 -0
- package/dist/services/NousHermesRunner.d.ts.map +1 -1
- package/dist/services/NousHermesRunner.js +476 -549
- package/dist/services/NousHermesRunner.js.map +1 -1
- package/dist/tools/agent_control.d.ts +1 -1
- package/dist/tools/agent_control.d.ts.map +1 -1
- package/dist/tools/agent_control.js +4 -3
- package/dist/tools/agent_control.js.map +1 -1
- package/dist/tools/config_example.d.ts +1 -0
- package/dist/tools/config_example.d.ts.map +1 -1
- package/dist/tools/config_example.js +45 -2
- package/dist/tools/config_example.js.map +1 -1
- package/dist/tools/create_agent.d.ts +1 -1
- package/dist/tools/manage_agents.d.ts +2 -2
- package/dist/tools/run_agent.d.ts +2 -1
- package/dist/tools/run_agent.d.ts.map +1 -1
- package/dist/tools/run_agent.js +30 -3
- package/dist/tools/run_agent.js.map +1 -1
- package/dist/tools/run_agents_parallel.d.ts +2 -1
- package/dist/tools/run_agents_parallel.d.ts.map +1 -1
- package/dist/tools/run_gemini.d.ts +13 -0
- package/dist/tools/run_gemini.d.ts.map +1 -1
- package/dist/tools/run_gemini.js +6 -2
- package/dist/tools/run_gemini.js.map +1 -1
- package/dist/tools/run_hermes.d.ts +1 -0
- package/dist/tools/run_hermes.d.ts.map +1 -1
- package/dist/tools/run_hermes.js +22 -15
- package/dist/tools/run_hermes.js.map +1 -1
- package/docs/agent-http-tutorial.md +524 -524
- package/docs/provider-config-map.md +444 -0
- package/package.json +8 -10
- package/scripts/_db_check.py +10 -0
- package/scripts/status_check.py +20 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
# Hermes x Overmind — Config Provider Map
|
|
2
|
+
|
|
3
|
+
## Ordre de resolution (qui gagne, qui perd)
|
|
4
|
+
|
|
5
|
+
Chaque variable suit cette priorite (la premiere gagne):
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
HERMES_HOME/.env (C:\Users\Deamon\AppData\Local\hermes\.env)
|
|
9
|
+
↓
|
|
10
|
+
settings_[agent].json → env (apres interpolation $VAR par process.env)
|
|
11
|
+
↓
|
|
12
|
+
Workflow/.env (C:\Users\Deamon\Desktop\Backup\Serveur MCP\Workflow\.env)
|
|
13
|
+
↓
|
|
14
|
+
process.env (env du parent, herite par le spawn)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**MAIS** pour `OPENROUTER_API_KEY` uniquement:
|
|
18
|
+
- Hermes lit d'abord `HERMES_HOME/.env` puis `os.environ`
|
|
19
|
+
- Si present dans `auth.json` avec status `exhausted` → skip
|
|
20
|
+
- Si present dans `HERMES_HOME/.env` (meme vide `""`) → **PREND LA PRIORITE sur process.env**
|
|
21
|
+
|
|
22
|
+
**MAIS** pour tous les autres providers (zai, minimax-cn, etc.):
|
|
23
|
+
- Hermes lit `HERMES_HOME/.env` → si vide/null → lit `os.environ`
|
|
24
|
+
- `os.environ` contient tout ce que le parent a passe (donc le `.env` du Workflow)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Les 5 fichiers cles
|
|
29
|
+
|
|
30
|
+
| Fichier | Role |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `HERMES_HOME/.env` | API keys globales Hermes (fallback) |
|
|
33
|
+
| `Workflow/.env` | Variables du workflow (DB, tokens, etc.) |
|
|
34
|
+
| `settings_[agent].json` | Config par agent (model, provider, tokens, MCP) |
|
|
35
|
+
| `HERMES_HOME/.hermes/config.yaml` | Config systeme Hermes (model.default, provider, etc.) |
|
|
36
|
+
| `HERMES_HOME/auth.json` | Credential pool — status des tokens (ok/exhausted), URLs par provider |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Les 2 endpoints Z.AI (DECOUVERTE CRITIQUE)
|
|
41
|
+
|
|
42
|
+
Z.AI a **deux endpoints distincts** — confusion entre les deux causait des erreurs 402:
|
|
43
|
+
|
|
44
|
+
| Endpoint | URL | Usage |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| **Coding** (celui qu'il faut) | `https://api.z.ai/api/coding/paas/v4` | Inference LLM (Hermes, Overmind) |
|
|
47
|
+
| **Non-coding** (ancien, different billing) | `https://api.z.ai/api/paas/v4` | Autre chose (pas le meme systeme de facturation) |
|
|
48
|
+
|
|
49
|
+
**Comment le credential pool est seed:**
|
|
50
|
+
|
|
51
|
+
| Source dans .env | Cle dans auth.json | base_url assignee |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `ZAI_ANTHROPIC_FALLBACK_KEY` | `zai[0].access_token` | `https://api.z.ai/api/coding/paas/v4` ✅ |
|
|
54
|
+
| `Z_AI_API_KEY` | `zai[1].access_token` | `https://api.z.ai/api/paas/v4` ❌ (ancien) |
|
|
55
|
+
|
|
56
|
+
Le premier entry (priority 0) est utilise en premier. C'est celui qui est seed par `writeAuthJson()` dans `NousHermesRunner.ts` → `ZAI_ANTHROPIC_FALLBACK_KEY`.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Provider → Ce qu'Hermes attend
|
|
61
|
+
|
|
62
|
+
### Z.AI (id: `zai`)
|
|
63
|
+
|
|
64
|
+
| Param | Valeur attendue | Source dans Hermes |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| Provider ID | `zai` | config.yaml ou settings |
|
|
67
|
+
| API Key | `ZAI_ANTHROPIC_FALLBACK_KEY` (cle primaire) ou `Z_AI_API_KEY` (fallback ancien) | `HERMES_HOME/.env` → `os.environ` |
|
|
68
|
+
| Base URL | `https://api.z.ai/api/coding/paas/v4` | credential pool (seed par writeAuthJson) |
|
|
69
|
+
| Model | `glm-5.1` | settings `env.ANTHROPIC_MODEL` |
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
// settings_[agent].json — Z.AI correct
|
|
73
|
+
{
|
|
74
|
+
"env": {
|
|
75
|
+
"ANTHROPIC_AUTH_TOKEN": "$ZAI_ANTHROPIC_FALLBACK_KEY",
|
|
76
|
+
"ANTHROPIC_BASE_URL": "https://api.z.ai/api/coding/paas/v4",
|
|
77
|
+
"ANTHROPIC_MODEL": "glm-5.1"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# .env minimal pour Z.AI
|
|
84
|
+
ZAI_ANTHROPIC_FALLBACK_KEY=5f650035e5a845549e4765184d8179b1.GdehlMpHT0dKq3m3
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Le credential pool `auth.json` est ecrit par `writeAuthJson()` dans `NousHermesRunner.ts`. La cle `ZAI_ANTHROPIC_FALLBACK_KEY` est envoyee par `agentCustomEnv` → Hermes seed le credential pool avec le bon endpoint.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
### Z.AI Multi-Token (E/Y)
|
|
92
|
+
|
|
93
|
+
Deamon a 2 tokens Z.AI (E=primary, Y=secondary). Le credential pool peut contenir les deux:
|
|
94
|
+
|
|
95
|
+
| Token | Label dans auth.json | Cle dans .env |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| Primary | `ANTHROPIC_AUTH_TOKEN_E` | `ANTHROPIC_AUTH_TOKEN_E` = `5f65...q3m3` |
|
|
98
|
+
| Secondary | `ANTHROPIC_AUTH_TOKEN_Y` | `ANTHROPIC_AUTH_TOKEN_Y` = `c78a...1ISt` |
|
|
99
|
+
|
|
100
|
+
Pour qu'un agent utilise le token Y (secondary) au lieu de E (primary), le settings doit utiliser `$ANTHROPIC_AUTH_TOKEN_Y` au lieu de `$ANTHROPIC_AUTH_TOKEN_E`.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### MiniMax CN (id: `minimax-cn`)
|
|
105
|
+
|
|
106
|
+
| Param | Valeur attendue | Source dans Hermes |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| Provider ID | `minimax-cn` | config.yaml ou settings |
|
|
109
|
+
| API Key | `MINIMAX_CN_API_KEY` **uniquement** | `HERMES_HOME/.env` → `os.environ` |
|
|
110
|
+
| Base URL | `https://api.minimaxi.com/anthropic` | hardcoded dans ProviderConfig |
|
|
111
|
+
| Model | `MiniMax-M2.7` | settings `env.ANTHROPIC_MODEL` |
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
// settings_[agent].json — MiniMax correct
|
|
115
|
+
{
|
|
116
|
+
"env": {
|
|
117
|
+
"ANTHROPIC_AUTH_TOKEN": "$MINIMAX_CN_API_KEY",
|
|
118
|
+
"ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
|
|
119
|
+
"ANTHROPIC_MODEL": "MiniMax-M2.7"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
# .env minimal pour MiniMax
|
|
126
|
+
MINIMAX_CN_API_KEY=ton_token_minimax_ici
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**auth.json** stocke sous `MINIMAX_CN_API_KEY`.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### OpenRouter — BANNIR pour LLM
|
|
134
|
+
|
|
135
|
+
| Param | Valeur attendue | Source |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| Provider ID | — | **Ne PAS utiliser** |
|
|
138
|
+
| API Key | `OPENROUTER_API_KEY` | `HERMES_HOME/.env` → `os.environ` |
|
|
139
|
+
| Base URL | `https://openrouter.ai/api/v1` | hardcoded |
|
|
140
|
+
| Guardrail | — | Force 404 si active |
|
|
141
|
+
|
|
142
|
+
**PROBLEME:** Si `OPENROUTER_API_KEY` est present (meme dans `OVERMIND_EMBEDDING_KEY` route via NousHermesRunner), Hermes le detecte et tente OpenRouter pour l'inference.
|
|
143
|
+
|
|
144
|
+
**auth.json** a une entree OpenRouter — si le status est `exhausted`, Hermes ne retry plus mais peut quand meme picker le provider "openrouter" dans le credential pool.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Comment Hermes decide quel provider utiliser
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
1. Si `provider` explicite dans config.yaml → utilise ce provider
|
|
152
|
+
2. Sinon si `ANTHROPIC_BASE_URL` contient openrouter → "openrouter"
|
|
153
|
+
3. Sinon lit model name → compare avec model_defaults par provider
|
|
154
|
+
- "glm-*" → "zai"
|
|
155
|
+
- "MiniMax-*" → "minimax-cn"
|
|
156
|
+
4. Sinon fallback: model.default dans config.yaml
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Le model resolve le provider. Donc `ANTHROPIC_MODEL=glm-5.1` sans provider explicite → `zai`. `ANTHROPIC_MODEL=MiniMax-M2.7` → `minimax-cn`.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Comment NousHermesRunner passe les vars a Hermes
|
|
164
|
+
|
|
165
|
+
Le runner lit `settings_[agent].json` → applique `interpolateEnvVars()` qui remplace `$VAR` par `process.env[VAR]` → envoie le tout dans `agentCustomEnv` au processus Hermes.
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
// Ce que NousHermesRunner.ts passe a Hermes (agentCustomEnv)
|
|
169
|
+
const agentCustomEnv = {
|
|
170
|
+
...process.env, // HERMES_HOME/.env + Workflow/.env fusionnes
|
|
171
|
+
PYTHONIOENCODING: 'utf-8',
|
|
172
|
+
OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '', // VIDE (fixe)
|
|
173
|
+
NVIDIA_API_KEY: process.env.NVIDIA_API_KEY || process.env.NVAPI_KEY,
|
|
174
|
+
ANTHROPIC_AUTH_TOKEN: s.env.ANTHROPIC_AUTH_TOKEN, // interpolate
|
|
175
|
+
ANTHROPIC_BASE_URL: s.env.ANTHROPIC_BASE_URL, // interpolate
|
|
176
|
+
ANTHROPIC_MODEL: s.env.ANTHROPIC_MODEL, // interpolate
|
|
177
|
+
};
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Puis lance Hermes avec `--env-file` pour discord_llm + Workflow `.env` (via startpipeline.js).
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Le probleme de OPENROUTER_API_KEY
|
|
185
|
+
|
|
186
|
+
**AVANT le fix:**
|
|
187
|
+
```typescript
|
|
188
|
+
OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || process.env.OVERMIND_EMBEDDING_KEY,
|
|
189
|
+
```
|
|
190
|
+
→ Si `OPENROUTER_API_KEY` vide mais `OVERMIND_EMBEDDING_KEY` present → passe quand meme une cle OpenRouter a Hermes → Hermes detecte `OPENROUTER_API_KEY` → tente OpenRouter → 404 guardrail.
|
|
191
|
+
|
|
192
|
+
**APRES le fix:**
|
|
193
|
+
```typescript
|
|
194
|
+
OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '',
|
|
195
|
+
```
|
|
196
|
+
→ `OVERMIND_EMBEDDING_KEY` n'est plus redirige. Si `OPENROUTER_API_KEY` absent du `.env`, Hermes recoit string vide et ne pick pas OpenRouter.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Comment Hermes obtient la API Key (le vrai flux)
|
|
201
|
+
|
|
202
|
+
Le `ANTHROPIC_AUTH_TOKEN` dans `settings.json` **ne passe pas directement** dans le body de la requete API. Hermes utilise son propre credential pool:
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
settings_[agent].json
|
|
206
|
+
"env": {
|
|
207
|
+
"ANTHROPIC_AUTH_TOKEN": "$ZAI_ANTHROPIC_FALLBACK_KEY", ← Runner remplace $VAR → "token_reel"
|
|
208
|
+
"ANTHROPIC_BASE_URL": "https://api.z.ai/api/coding/paas/v4",
|
|
209
|
+
"ANTHROPIC_MODEL": "glm-5.1"
|
|
210
|
+
}
|
|
211
|
+
↓ (interpolateEnvVars par NousHermesRunner)
|
|
212
|
+
agentCustomEnv envoye a Hermes:
|
|
213
|
+
ANTHROPIC_AUTH_TOKEN=token_reel
|
|
214
|
+
ANTHROPIC_BASE_URL=https://api.z.ai/api/coding/paas/v4
|
|
215
|
+
ANTHROPIC_MODEL=glm-5.1
|
|
216
|
+
|
|
217
|
+
MAIS Hermes ne lit PAS ANTHROPIC_AUTH_TOKEN directement.
|
|
218
|
+
Hermes lit le CREDENTIAL POOL (auth.json) + les .env vars listees dans api_key_env_vars.
|
|
219
|
+
|
|
220
|
+
Credential pool est seed par:
|
|
221
|
+
ZAI_ANTHROPIC_FALLBACK_KEY → "zai" avec base_url coding ✅
|
|
222
|
+
Z_AI_API_KEY → "zai" avec base_url non-coding (ancien)
|
|
223
|
+
MINIMAX_CN_API_KEY → "minimax-cn"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Le `$VAR` dans `ANTHROPIC_AUTH_TOKEN` est juste une convenience pour que le token traverse le runner et arrive dans `process.env` du subprocess Hermes. C'est `process.env.ZAI_ANTHROPIC_FALLBACK_KEY` qui seed le credential pool.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Le flow complet (Z.AI par exemple)
|
|
231
|
+
|
|
232
|
+
1. `Workflow/.env` contient `ZAI_ANTHROPIC_FALLBACK_KEY=<TOKEN>`
|
|
233
|
+
2. `startpipeline.js` charge `.env` → `process.env.ZAI_ANTHROPIC_FALLBACK_KEY`
|
|
234
|
+
3. ` NousHermesRunner` lit `settings_zai.json` → `interpolateEnvVars()`
|
|
235
|
+
- `$ZAI_ANTHROPIC_FALLBACK_KEY` → `process.env["ZAI_ANTHROPIC_FALLBACK_KEY"]` → `"<TOKEN>"`
|
|
236
|
+
- `ANTHROPIC_AUTH_TOKEN="<TOKEN>"` (valeur concrete maintenant)
|
|
237
|
+
4. `agentCustomEnv` envoye a Hermes:
|
|
238
|
+
- `ANTHROPIC_AUTH_TOKEN=<TOKEN>`
|
|
239
|
+
- `ANTHROPIC_BASE_URL=https://api.z.ai/api/coding/paas/v4`
|
|
240
|
+
- `ANTHROPIC_MODEL=glm-5.1`
|
|
241
|
+
5. Hermes fait son propre lookup:
|
|
242
|
+
- `load_pool("zai")` → `_resolve_api_key_provider_secret("zai")`
|
|
243
|
+
- Cherche `ZAI_ANTHROPIC_FALLBACK_KEY` via `_get_env_prefer_dotenv()` dans `HERMES_HOME/.env` puis `os.environ`
|
|
244
|
+
- Trouve dans `os.environ` (herite du parent)
|
|
245
|
+
- `writeAuthJson()` ecrit dans `auth.json` avec base_url `https://api.z.ai/api/coding/paas/v4`
|
|
246
|
+
6. API call → utilise le credential pool entry pour `zai` avec le bon endpoint
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## OPENROUTER et Les Embeddings
|
|
251
|
+
|
|
252
|
+
**`OVERMIND_EMBEDDING_KEY`** = clef OpenRouter pour les **embeddings uniquement** (PostgresMemoryProvider du Workflow). Elle est dans le `.env` Overmind. Hermes n'a pas besoin de la voir pour l'LLM inference.
|
|
253
|
+
|
|
254
|
+
**NousHermesRunner ne doit jamais forwarder de clef OpenRouter a Hermes.** OpenRouter n'est pas un provider LLM dans ce setup. Si `OPENROUTER_API_KEY` arrive jusqu'a Hermes, il detecte la clef et tente OpenRouter pour l'inference → 404 guardrail.
|
|
255
|
+
|
|
256
|
+
**Fix applique:**
|
|
257
|
+
```typescript
|
|
258
|
+
OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY || '',
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Le config.yaml ecrit par NousHermesRunner (exemple sniperbot_analyst)
|
|
264
|
+
|
|
265
|
+
```yaml
|
|
266
|
+
mcp_servers:
|
|
267
|
+
memory-server:
|
|
268
|
+
url: "http://localhost:3099/mcp"
|
|
269
|
+
discord-server:
|
|
270
|
+
url: "http://localhost:3141/mcp"
|
|
271
|
+
x-mcp-server:
|
|
272
|
+
url: "http://localhost:3142/mcp"
|
|
273
|
+
postgresql-server:
|
|
274
|
+
url: "http://localhost:5433/mcp"
|
|
275
|
+
|
|
276
|
+
model:
|
|
277
|
+
default: glm-5.1
|
|
278
|
+
provider: z-ai
|
|
279
|
+
|
|
280
|
+
tts:
|
|
281
|
+
provider: elevenlabs
|
|
282
|
+
voice: charlie
|
|
283
|
+
voice_id: IKne3meq5aSn9XLyUdCD
|
|
284
|
+
model: eleven_multilingual_v2
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
Ce config est ecrit dans `.overmind/hermes/agent_<name>/.hermes/config.yaml` a chaque run. Les valeurs viennent de `settings_<agent>.json` + defaults.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Checklist pour ajouter un nouveau provider
|
|
292
|
+
|
|
293
|
+
1. **Verifier le ProviderConfig** dans `hermes-agent/hermes_cli/auth.py`
|
|
294
|
+
- Verifier `api_key_env_vars` (les vars que Hermes cherche)
|
|
295
|
+
- Verifier `inference_base_url` (URL par defaut)
|
|
296
|
+
- Verifier `base_url_env_var` (optionnel, surcharge URL)
|
|
297
|
+
|
|
298
|
+
2. **Ajouter dans Workflow/.env**
|
|
299
|
+
```bash
|
|
300
|
+
MAISON_API_KEY=cle_api_du_fournisseur
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
3. **Ajouter dans settings_[agent].json**
|
|
304
|
+
```json
|
|
305
|
+
{
|
|
306
|
+
"env": {
|
|
307
|
+
"ANTHROPIC_AUTH_TOKEN": "$MAISON_API_KEY",
|
|
308
|
+
"ANTHROPIC_BASE_URL": "https://api.fournisseur.com/v1",
|
|
309
|
+
"ANTHROPIC_MODEL": "model-name"
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
4. **Verifier auth.json** — apres premiere utilisation, Hermes stocke le token avec status.
|
|
315
|
+
- Si `exhausted` → Hermes skip ce provider automatiquement
|
|
316
|
+
- Si `ok` → utilise le token
|
|
317
|
+
|
|
318
|
+
5. **NE JAMAIS** faire de mapping `AUTRE_CHOSE_API_KEY → OPENROUTER_API_KEY` — ca force OpenRouter.
|
|
319
|
+
|
|
320
|
+
6. **Pour eviter OpenRouter:** pas de `OPENROUTER_API_KEY` dans `HERMES_HOME/.env`
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Resume
|
|
325
|
+
|
|
326
|
+
| Tu veux... | Utilise ces vars |
|
|
327
|
+
|---|---|
|
|
328
|
+
| Z.AI (glm-5.1) | `ZAI_ANTHROPIC_FALLBACK_KEY` dans `.env` + settings `$ZAI_ANTHROPIC_FALLBACK_KEY` |
|
|
329
|
+
| Z.AI secondary (token Y) | `ANTHROPIC_AUTH_TOKEN_Y` dans `.env` + settings `$ANTHROPIC_AUTH_TOKEN_Y` |
|
|
330
|
+
| MiniMax CN | `MINIMAX_CN_API_KEY` dans `.env` + settings `$MINIMAX_CN_API_KEY` |
|
|
331
|
+
| Embeddings OpenRouter | `OVERMIND_EMBEDDING_KEY` (pour embeddings, PAS LLM) |
|
|
332
|
+
| Eviter OpenRouter LLM | Pas de `OPENROUTER_API_KEY` dans `HERMES_HOME/.env` |
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Gemini / @google/gemini-cli (id: `gemini`)
|
|
337
|
+
|
|
338
|
+
Le runner `gemini` utilise **`@google/gemini-cli`** (npm, v0.43.0) en headless mode.
|
|
339
|
+
Le CLI est installé via `npm install -g @google/gemini-cli` et disponible dans le PATH.
|
|
340
|
+
|
|
341
|
+
### Installation
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
npm install -g @google/gemini-cli
|
|
345
|
+
gemini --version # → 0.43.0
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Flags CLI utilisés
|
|
349
|
+
|
|
350
|
+
| Flag | Valeur | Rôle |
|
|
351
|
+
|---|---|---|
|
|
352
|
+
| `-p` / `--prompt` | prompt text | Mode headless (non-interactif) |
|
|
353
|
+
| `--approval-mode` | `yolo` | Auto-approve tous les outils |
|
|
354
|
+
| `--session-id` | UUID | Session persistante entre appels |
|
|
355
|
+
| `--acp` | (flag) | Active le protocol agent (ACP) |
|
|
356
|
+
| `--model` | `antigravity/<MODE>` | Passe le mode Antigravity comme contexte |
|
|
357
|
+
| `--output-format` | `json` | Output structuré pour parser session_id |
|
|
358
|
+
|
|
359
|
+
### Commandes equivalents (CLI direct)
|
|
360
|
+
|
|
361
|
+
```bash
|
|
362
|
+
# Test quick
|
|
363
|
+
gemini -p "Dis-moi bonjour" --approval-mode yolo
|
|
364
|
+
|
|
365
|
+
# Avec session
|
|
366
|
+
gemini -p "Analyse ce code" --approval-mode yolo --session-id <uuid> --acp
|
|
367
|
+
|
|
368
|
+
# Mode PLAN
|
|
369
|
+
gemini -p "Planifie cette tache" --model antigravity/PLAN --approval-mode yolo --acp
|
|
370
|
+
|
|
371
|
+
# List sessions
|
|
372
|
+
gemini --list-sessions
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Modes Antigravity (parametre `mode`)
|
|
376
|
+
|
|
377
|
+
Le mode est passe via `--model antigravity/<MODE>` pour donner du contexte au modele.
|
|
378
|
+
|
|
379
|
+
|| Mode | Usage |
|
|
380
|
+
|---|---|
|
|
381
|
+
| `GENERAL` | Mode par defaut, taches polyvalentes |
|
|
382
|
+
| `CONTEXT_CHECK` | Verification de contexte code |
|
|
383
|
+
| `PLAN` | Planification de taches complexes |
|
|
384
|
+
| `COMMAND` | Execution de commandes shell |
|
|
385
|
+
| `CASCADE` | Execution en cascade multi-agents |
|
|
386
|
+
| `EVAL` | Evaluation et revue de code |
|
|
387
|
+
| `ANTIGRAVITY_REVIEW` | Revue automatique Antigravity |
|
|
388
|
+
| `MQUERY` | Recherche multi-source |
|
|
389
|
+
| `COMMIT_MESSAGE` | Generation de messages de commit |
|
|
390
|
+
| `CHECKPOINT` | Sauvegarde de checkpoint |
|
|
391
|
+
| `FAST_APPLY` | Application rapide de patches |
|
|
392
|
+
|
|
393
|
+
### Utilisation Overmind (run_agent)
|
|
394
|
+
|
|
395
|
+
```typescript
|
|
396
|
+
// run_agent avec runner: 'gemini'
|
|
397
|
+
const result = await runAgent({
|
|
398
|
+
runner: 'gemini', // GeminiRunner → gemini CLI npm
|
|
399
|
+
prompt: 'Analyse ce code',
|
|
400
|
+
agentName: 'expert_python',
|
|
401
|
+
mode: 'GENERAL', // GENERAL, PLAN, COMMAND, CASCADE, EVAL, etc.
|
|
402
|
+
autoResume: false,
|
|
403
|
+
configPath: './Workflow',
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
// ou directement via run_gemini.ts
|
|
407
|
+
const result = await runGeminiAgent({
|
|
408
|
+
prompt: '...',
|
|
409
|
+
mode: 'PLAN',
|
|
410
|
+
});
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Configuration agent
|
|
414
|
+
|
|
415
|
+
Chaque agent stocke sa config dans `.antigravity/agent_<nom>/`:
|
|
416
|
+
- `mcp.json` — serveurs MCP actifs (copies depuis settings_<agent>.json)
|
|
417
|
+
- Session store — sessions persistees
|
|
418
|
+
|
|
419
|
+
### Verification installation
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
gemini --version
|
|
423
|
+
# → 0.43.0
|
|
424
|
+
|
|
425
|
+
gemini mcp list
|
|
426
|
+
# → liste les MCP servers configures
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Erreurs connues
|
|
430
|
+
|
|
431
|
+
| Erreur | Cause | Fix |
|
|
432
|
+
|---|---|---|
|
|
433
|
+
| `GEMINI_CLI_NOT_INSTALLED` | `@google/gemini-cli` pas dans le PATH | `npm install -g @google/gemini-cli` |
|
|
434
|
+
| `EXIT_CODE_1` | Session invalide ou prompt rejete | Retry sans sessionId |
|
|
435
|
+
| `TIMEOUT` | Reponse > 15min | Augmente `CONFIG.TIMEOUT_MS` |
|
|
436
|
+
|
|
437
|
+
### Ce qui a change (historique)
|
|
438
|
+
|
|
439
|
+
|| Avant (session 2025) | Maintenant |
|
|
440
|
+
|---|---|---|
|
|
441
|
+
| Spawn `language_server_windows_x64.exe` avec flags inexistants | Spawn `gemini` (npm bin) avec flags reels |
|
|
442
|
+
| `--mode --prompt-file --session --output-format` (flags Go inexistants) | `-p --approval-mode yolo --session-id --acp --model --output-format json` |
|
|
443
|
+
| Auth via OAuth interne Antigravity IDE | Auth via Google account du CLI npm |
|
|
444
|
+
| Config `.antigravity/<agent>/` | Config `.antigravity/<agent>/` (MCP + sessions) |
|
package/package.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "overmind-mcp",
|
|
3
|
-
"version": "2.8.
|
|
4
|
-
"preferGlobal": true,
|
|
3
|
+
"version": "2.8.7",
|
|
5
4
|
"description": "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 QwenCli et Nous Hermes. Installation automatique des dépendances Docker (PostgreSQL, pgvector) inclus.",
|
|
6
5
|
"type": "module",
|
|
7
6
|
"main": "dist/index.js",
|
|
@@ -45,14 +44,15 @@
|
|
|
45
44
|
"version": "changeset version && node scripts/auto-changelog.mjs",
|
|
46
45
|
"release": "pnpm run build && changeset publish",
|
|
47
46
|
"prepublishOnly": "pnpm run rebuild",
|
|
48
|
-
"postinstall": "node scripts/postinstall.mjs
|
|
47
|
+
"postinstall": "node scripts/postinstall.mjs",
|
|
49
48
|
"setup": "overmind-setup",
|
|
50
49
|
"setup:deps": "node scripts/install-dependencies.mjs",
|
|
51
50
|
"postgres:up": "overmind-postgres-mcp up",
|
|
52
51
|
"postgres:down": "overmind-postgres-mcp down",
|
|
53
52
|
"postgres:status": "overmind-postgres-mcp status",
|
|
54
53
|
"postgres:logs": "overmind-postgres-mcp logs",
|
|
55
|
-
"postgres:reset": "overmind-postgres-mcp reset"
|
|
54
|
+
"postgres:reset": "overmind-postgres-mcp reset",
|
|
55
|
+
"prebuild": "node -e \"try{require('fs').copyFileSync('bin/launch.js','dist/bin/launch.js');console.log('Copied launch.js')}catch{console.log('dist/bin not ready yet')}\""
|
|
56
56
|
},
|
|
57
57
|
"keywords": [
|
|
58
58
|
"mcp",
|
|
@@ -76,8 +76,8 @@
|
|
|
76
76
|
"url": "https://discord.gg/4AR82phtBz"
|
|
77
77
|
},
|
|
78
78
|
"homepage": "https://deamondev888.github.io/overmind-mcp/",
|
|
79
|
-
|
|
80
|
-
"node": ">=20.0.0
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": ">=20.0.0"
|
|
81
81
|
},
|
|
82
82
|
"packageManager": "pnpm@10.18.0",
|
|
83
83
|
"devDependencies": {
|
|
@@ -85,10 +85,10 @@
|
|
|
85
85
|
"@eslint/js": "^10.0.1",
|
|
86
86
|
"@types/node": "^25.6.2",
|
|
87
87
|
"@types/pg": "^8.20.0",
|
|
88
|
-
"@types/pino": "^7.0.5",
|
|
89
88
|
"eslint": "^10.3.0",
|
|
90
89
|
"eslint-config-prettier": "^10.1.8",
|
|
91
90
|
"globals": "^17.6.0",
|
|
91
|
+
"pino-pretty": "^13.1.3",
|
|
92
92
|
"prettier": "^3.8.3",
|
|
93
93
|
"rimraf": "^6.1.3",
|
|
94
94
|
"typescript": "^6.0.3",
|
|
@@ -102,13 +102,11 @@
|
|
|
102
102
|
"overmind-postgres-mcp": "^1.3.0",
|
|
103
103
|
"pg": "^8.20.0",
|
|
104
104
|
"pino": "^10.3.1",
|
|
105
|
-
"pino-pretty": "^13.1.3",
|
|
106
105
|
"pino-roll": "^4.0.0",
|
|
107
106
|
"tinyglobby": "^0.2.16",
|
|
108
|
-
"tslib": "^2.8.1",
|
|
109
107
|
"zod": "^4.4.3"
|
|
110
108
|
},
|
|
111
109
|
"peerDependencies": {
|
|
112
110
|
"tslib": "^2.0.0"
|
|
113
111
|
}
|
|
114
|
-
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
import psycopg2
|
|
3
|
+
conn = psycopg2.connect(host="localhost", port=5432, dbname="financial_analyst", user="postgres")
|
|
4
|
+
cur = conn.cursor()
|
|
5
|
+
cur.execute("SELECT id, ligne, qte, description FROM bt_materiaux WHERE bon_id = 5 ORDER BY ligne")
|
|
6
|
+
rows = cur.fetchall()
|
|
7
|
+
print("MATERIAUX_BON5:", len(rows))
|
|
8
|
+
for r in rows:
|
|
9
|
+
print("LIGNE", r[1], "QTE", r[2], "DESC:", r[3][:80])
|
|
10
|
+
conn.close()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import psycopg2
|
|
2
|
+
conn = psycopg2.connect(host='localhost', port=5433, dbname='financial_analyst', user='postgres')
|
|
3
|
+
cur = conn.cursor()
|
|
4
|
+
cur.execute('''SELECT s.id, s.date_debut, s.date_fin, c.no_contrat, e.nom as employe
|
|
5
|
+
FROM bt_semaines s
|
|
6
|
+
JOIN bt_contrats c ON s.contrat_id = c.id
|
|
7
|
+
JOIN bt_employes e ON s.employe_id = e.id
|
|
8
|
+
ORDER BY s.date_debut DESC LIMIT 5''')
|
|
9
|
+
rows = cur.fetchall()
|
|
10
|
+
print('Dernieres semaines:')
|
|
11
|
+
for r in rows:
|
|
12
|
+
print(f' ID={r[0]} | {r[1]} a {r[2]} | contrat={r[3]} | employe={r[4]}')
|
|
13
|
+
|
|
14
|
+
cur.execute('SELECT COUNT(*) FROM bt_semaines')
|
|
15
|
+
print(f'Total semaines: {cur.fetchone()[0]}')
|
|
16
|
+
|
|
17
|
+
cur.execute('SELECT COUNT(*) FROM bt_employes WHERE actif=true')
|
|
18
|
+
print(f'Employes actifs: {cur.fetchone()[0]}')
|
|
19
|
+
|
|
20
|
+
conn.close()
|