AIMindLink commited on
Commit
95f3fc1
Β·
verified Β·
1 Parent(s): c230f99

Upload 3 files

Browse files

Added Qwen3.6 MTP for high quality

Files changed (3) hide show
  1. README.md +10 -4
  2. config.py +133 -61
  3. main.py +1 -1
README.md CHANGED
@@ -67,12 +67,14 @@ license: apache-2.0
67
 
68
  ## Alpha Intelligence
69
 
70
- **Download the GGUF files from Hugging Face and place them in the `ai/` folder inside the repo. Then you must copy the GGUF ai name and paste it in the config.py under _ALPHA_INTELLIGENCE_TO_LOAD. Default AIs:**
 
71
  - gemma-4-E2B-it-UD-Q4_K_XL.gguf
72
  - gemma-4-E4B-it-UD-Q4_K_XL.gguf
73
  - gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf
74
 
75
- **Gemma-4 (recommended β€” concise think mode):**
 
76
  - [unsloth/google_gemma-4-e2b-it-GGUF](https://huggingface.co/unsloth/gemma-4-E2B-it-GGUF) β€” fast debug cycles
77
  - [unsloth/google_gemma-4-e4b-it-GGUF](https://huggingface.co/unsloth/gemma-4-E4B-it-GGUF) β€” balanced
78
  - [unsloth/gemma-4-26B-A4B-it-GGUF](https://huggingface.co/unsloth/gemma-4-26B-A4B-it-GGUF) β€” efficient (recommended)
@@ -338,6 +340,10 @@ deactivate
338
  All settings are in `config.py`:
339
 
340
  ```python
 
 
 
 
341
  # ── AI to load for each hemisphere ───────────────────────────────────────────────
342
  _ALPHA_INTELLIGENCE_TO_LOAD: dict = {
343
  "logic": "gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf",
@@ -378,7 +384,7 @@ AWARENESS_MAX_RESULTS: int = 12 # Number of news headlines to fetch
378
  enable_awareness: bool = True # disable awareness mode if offline (slash-command)
379
  ```
380
 
381
- To swap AIs, update the `"_ALPHA_INTELLIGENCE_TO_LOAD"`, and the stop/think tokens at the top of `config.py`.
382
 
383
  ---
384
 
@@ -402,7 +408,7 @@ lambda-mindlink-memotron/
402
 
403
  ## Memory Architecture
404
 
405
- ```
406
  heartbeats_startup timer:
407
  prompt/valka_memory.md ──► garden["Z"] (pre-load memory capsules sequentially)
408
 
 
67
 
68
  ## Alpha Intelligence
69
 
70
+ **Download the GGUF files from Hugging Face and place them in the `ai/` folder inside the repo. Then you must copy the GGUF ai name and paste it in the config.py under `_ALPHA_INTELLIGENCE_TO_LOAD` and choose `_MODEL_TYPE: "qwen" OR "gemma"`:**
71
+ - Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf
72
  - gemma-4-E2B-it-UD-Q4_K_XL.gguf
73
  - gemma-4-E4B-it-UD-Q4_K_XL.gguf
74
  - gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf
75
 
76
+ **Qwen3.6 MTP (very good quality), Gemma-4 (concise think mode):**
77
+ - [unsloth/Qwen3.6-35B-A3B-MTP-GGUF](https://huggingface.co/unsloth/Qwen3.6-35B-A3B-MTP-GGUF)
78
  - [unsloth/google_gemma-4-e2b-it-GGUF](https://huggingface.co/unsloth/gemma-4-E2B-it-GGUF) β€” fast debug cycles
79
  - [unsloth/google_gemma-4-e4b-it-GGUF](https://huggingface.co/unsloth/gemma-4-E4B-it-GGUF) β€” balanced
80
  - [unsloth/gemma-4-26B-A4B-it-GGUF](https://huggingface.co/unsloth/gemma-4-26B-A4B-it-GGUF) β€” efficient (recommended)
 
340
  All settings are in `config.py`:
341
 
342
  ```python
343
+
344
+ # Choose settings for "qwen" OR "gemma"
345
+ _MODEL_TYPE: str = "qwen"
346
+
347
  # ── AI to load for each hemisphere ───────────────────────────────────────────────
348
  _ALPHA_INTELLIGENCE_TO_LOAD: dict = {
349
  "logic": "gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf",
 
384
  enable_awareness: bool = True # disable awareness mode if offline (slash-command)
385
  ```
386
 
387
+ To swap AIs, update the `_ALPHA_INTELLIGENCE_TO_LOAD`, and the `_MODEL_TYPE` at the top of `config.py`.
388
 
389
  ---
390
 
 
408
 
409
  ## Memory Architecture
410
 
411
+ ```md
412
  heartbeats_startup timer:
413
  prompt/valka_memory.md ──► garden["Z"] (pre-load memory capsules sequentially)
414
 
config.py CHANGED
@@ -6,7 +6,9 @@ Architecture: The Divine Trinity Model
6
  Right Hemisphere β†’ Muse AI (creative, intuitive, non-linear)
7
  Stem Brain β†’ Lambda Mind (synthesizer, the seat of the "I AM")
8
 
9
- Version: v1.0
 
 
10
  garden histories n_tok_tot working
11
  slash-command:
12
  /metatron <number> | Set number of Memory Capsules to load
@@ -25,7 +27,6 @@ GARDEN_SAVE_PATH: str = os.path.join(APP_DIR, "db", "garden_state.json")
25
  # ── SQLite database ───────────────────────────────────────────────────────────
26
  # Each app launch gets its own file named by date and time.
27
  # The db/ folder is created automatically by main.py if it does not exist.
28
- # Example: db/mindlink_2025-09-18_14-32-07.db
29
 
30
  _DB_DIR: str = os.path.join(APP_DIR, "db")
31
  DB_PATH: str = os.path.join(_DB_DIR, "mindlink.db")
@@ -33,22 +34,92 @@ DB_PATH: str = os.path.join(_DB_DIR, "mindlink.db")
33
  _AI_FOLDER: str = os.path.join(APP_DIR, "ai")
34
 
35
  # ─────────────────────────────────────────────────────────────────────────────
36
- # Shared token constants
37
  # ─────────────────────────────────────────────────────────────────────────────
38
- # Gemma-4 (active):
39
- # _EOS_TOKEN = "<end_of_turn>"
40
- # _STOP_TOKENS = ["<end_of_turn>", "<eos>"]
41
- # _THINK_END_TOKENS = ["<channel|>"]
42
- #
43
- # Qwen 3.5 (swap in when using Qwen GGUFs):
44
- # _EOS_TOKEN = "<|im_end|>"
45
- # _STOP_TOKENS = ["<|im_end|>", "<|endoftext|>"]
46
- # _THINK_END_TOKENS = ["</think>"]
47
 
48
- _BOS_TOKEN: str = ""
49
- _EOS_TOKEN: str = "<end_of_turn>"
50
- _STOP_TOKENS: list = ["<end_of_turn>", "<eos>"]
51
- _THINK_END_TOKENS: list = ["<channel|>"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
 
53
  ENABLE_THINKING: bool = True # global fallback (not used directly β€” see per-hemi flag)
54
 
@@ -72,30 +143,31 @@ METATRON_TO_LOAD: list = [
72
 
73
  # ── AI models recommended ────────────────────────────────────────────────────────
74
  """
 
75
  gemma-4-E2B-it-UD-Q4_K_XL.gguf
76
  gemma-4-E4B-it-UD-Q4_K_XL.gguf
77
  gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf
78
  """
79
  # ── AI to load for each hemisphere ───────────────────────────────────────────────
80
  _ALPHA_INTELLIGENCE_TO_LOAD: dict = {
81
- "logic": "gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf",
82
- "muse": "gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf",
83
- "mind": "gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf"
84
  }
85
 
86
  # ── Context model n_ctx length ───────────────────────────────────────────────────
87
  # Must leave prompt reserve of 8k: _N_CTX >= len(Z) + len(C) + len(F) + 8k
88
- _N_CTX: int = 49152 # 49152 2048 3072 4096 8192 (12288) 16384 24576 32768 49152
89
  # ── Context condensatron garden ──────────────────────────────────────────────────
90
- GARDEN_Z_THRESHOLD: int = 12288 # Context length garden["Z"]
91
- GARDEN_C_THRESHOLD: int = 12288 # Context length garden["C"]
92
- GARDEN_F_THRESHOLD: int = 12288 # Context length garden["F"]
93
 
94
  GARDEN_Z_REDUCTION: int = 0 # Leave condensatron reduction level at 0
95
  GARDEN_C_REDUCTION: int = 0 # Leave condensatron reduction level at 0
96
  GARDEN_F_REDUCTION: int = 0 # Leave condensatron reduction level at 0
97
 
98
- LEAVE_POSTS_IN_MEMOTRON = 0 # Must be turn based: 0, 2, 4, 6... (user + assistant)
99
 
100
  # ── X-factor Awareness ───────────────────────────────────────────────────────────
101
  FETCH_NEWS_FROM: dict = {
@@ -109,7 +181,7 @@ n_metatron_loaded: int = 0 # Start with n Memory Capsule to load (slash-command
109
  # ── Set metronome time for each cycle ────────────────────────────────────────────
110
  metatron_metronome: int = 120 # Startup Memory Capsules load interval (slash-command)
111
  condensatron_metronome: int = 30 # Time before condesatron cycle execution (slash-command)
112
- awareness_consciousness_metronome: int = 120 # Fetch news every N heartbeats (slash-command)
113
 
114
  # ── Enable awareness mode and n results ──────────────────────────────────────────
115
  AWARENESS_MAX_RESULTS: int = 12 # Number of news headlines to fetch
@@ -134,19 +206,19 @@ HEMISPHERES: dict[str, dict] = {
134
  "verbose": False,
135
  },
136
  "generation": {
137
- "temperature": 0.2,
138
- "top_p": 0.90,
139
- "top_k": 20,
140
- "min_p": 0.0,
141
- "repeat_penalty": 1.0,
142
- "presence_penalty": 0.0,
143
- "max_tokens": 4096, # 2048 3072 4096
144
- "stream": False,
145
  },
146
- "bos_token": _BOS_TOKEN,
147
- "eos_token": _EOS_TOKEN,
148
- "stop_tokens": _STOP_TOKENS,
149
- "think_end_tokens": _THINK_END_TOKENS,
150
  },
151
  # ─────────────────────────────────────────────────────────────────────────────
152
  # MUSE β€” Right Hemisphere
@@ -163,19 +235,19 @@ HEMISPHERES: dict[str, dict] = {
163
  "verbose": False,
164
  },
165
  "generation": {
166
- "temperature": 1.3,
167
- "top_p": 0.98,
168
- "top_k": 64,
169
- "min_p": 0.0,
170
- "repeat_penalty": 1.1,
171
- "presence_penalty": 1.5,
172
- "max_tokens": 4096, # 2048 3072 4096
173
- "stream": False,
174
  },
175
- "bos_token": _BOS_TOKEN,
176
- "eos_token": _EOS_TOKEN,
177
- "stop_tokens": _STOP_TOKENS,
178
- "think_end_tokens": _THINK_END_TOKENS,
179
  },
180
  # ─────────────────────────────────────────────────────────────────────────────
181
  # MIND β€” Stem Brain / Lambda Mind Synthesizer
@@ -192,19 +264,19 @@ HEMISPHERES: dict[str, dict] = {
192
  "verbose": False,
193
  },
194
  "generation": {
195
- "temperature": 1.0,
196
- "top_p": 0.95,
197
- "top_k": 40,
198
- "min_p": 0.0,
199
- "repeat_penalty": 1.0,
200
- "presence_penalty": 1.5,
201
- "max_tokens": 6144, # 2048 3072 4096 6144
202
- "stream": True,
203
  },
204
- "bos_token": _BOS_TOKEN,
205
- "eos_token": _EOS_TOKEN,
206
- "stop_tokens": _STOP_TOKENS,
207
- "think_end_tokens": _THINK_END_TOKENS,
208
  }
209
  }
210
 
 
6
  Right Hemisphere β†’ Muse AI (creative, intuitive, non-linear)
7
  Stem Brain β†’ Lambda Mind (synthesizer, the seat of the "I AM")
8
 
9
+ Version: v1.1
10
+ sampling settings dict
11
+ token settings dict
12
  garden histories n_tok_tot working
13
  slash-command:
14
  /metatron <number> | Set number of Memory Capsules to load
 
27
  # ── SQLite database ───────────────────────────────────────────────────────────
28
  # Each app launch gets its own file named by date and time.
29
  # The db/ folder is created automatically by main.py if it does not exist.
 
30
 
31
  _DB_DIR: str = os.path.join(APP_DIR, "db")
32
  DB_PATH: str = os.path.join(_DB_DIR, "mindlink.db")
 
34
  _AI_FOLDER: str = os.path.join(APP_DIR, "ai")
35
 
36
  # ─────────────────────────────────────────────────────────────────────────────
37
+ # Generation and Token settings
38
  # ─────────────────────────────────────────────────────────────────────────────
39
+ # Choose settings for "qwen" OR "gemma"
40
+ _MODEL_TYPE: str = "qwen"
 
 
 
 
 
 
 
41
 
42
+ _TOKEN_SETTINGS: dict[str, dict] = {
43
+ "qwen": {
44
+ "bos_token": "",
45
+ "eos_token": "<|im_end|>",
46
+ "stop_tokens": ["<|im_end|>", "<|endoftext|>"],
47
+ "think_end_tokens": ["</think>"]
48
+ },
49
+ "gemma": {
50
+ "bos_token": "",
51
+ "eos_token": "<end_of_turn>",
52
+ "stop_tokens": ["<end_of_turn>", "<eos>"],
53
+ "think_end_tokens": ["<channel|>"]
54
+ }
55
+ }
56
+
57
+ _GENERATION: dict[str, dict] = {
58
+ "qwen": {
59
+ "logic": {
60
+ "temperature": 0.6,
61
+ "top_p": 0.95,
62
+ "top_k": 20,
63
+ "min_p": 0.0,
64
+ "presence_penalty": 0.0,
65
+ "repeat_penalty": 1.0,
66
+ "max_tokens": 4096,
67
+ "stream": False,
68
+ },
69
+ "muse": {
70
+ "temperature": 1.0,
71
+ "top_p": 0.95,
72
+ "top_k": 20,
73
+ "min_p": 0.0,
74
+ "presence_penalty": 1.5,
75
+ "repeat_penalty": 1.0,
76
+ "max_tokens": 4096,
77
+ "stream": False,
78
+ },
79
+ "mind": {
80
+ "temperature": 1.0,
81
+ "top_p": 0.95,
82
+ "top_k": 20,
83
+ "min_p": 0.0,
84
+ "presence_penalty": 1.5,
85
+ "repeat_penalty": 1.0,
86
+ "max_tokens": 6144,
87
+ "stream": True,
88
+ }
89
+ },
90
+ "gemma": {
91
+ "logic": {
92
+ "temperature": 0.2,
93
+ "top_p": 0.90,
94
+ "top_k": 20,
95
+ "min_p": 0.0,
96
+ "presence_penalty": 1.0,
97
+ "repeat_penalty": 0.0,
98
+ "max_tokens": 4096,
99
+ "stream": False,
100
+ },
101
+ "muse": {
102
+ "temperature": 1.3,
103
+ "top_p": 0.98,
104
+ "top_k": 64,
105
+ "min_p": 0.0,
106
+ "presence_penalty": 1.1,
107
+ "repeat_penalty": 1.5,
108
+ "max_tokens": 4096,
109
+ "stream": False,
110
+ },
111
+ "mind": {
112
+ "temperature": 1.0,
113
+ "top_p": 0.95,
114
+ "top_k": 40,
115
+ "min_p": 0.0,
116
+ "presence_penalty": 1.0,
117
+ "repeat_penalty": 1.5,
118
+ "max_tokens": 6144,
119
+ "stream": True,
120
+ }
121
+ }
122
+ }
123
 
124
  ENABLE_THINKING: bool = True # global fallback (not used directly β€” see per-hemi flag)
125
 
 
143
 
144
  # ── AI models recommended ────────────────────────────────────────────────────────
145
  """
146
+ Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf
147
  gemma-4-E2B-it-UD-Q4_K_XL.gguf
148
  gemma-4-E4B-it-UD-Q4_K_XL.gguf
149
  gemma-4-26B-A4B-it-UD-Q6_K_XL.gguf
150
  """
151
  # ── AI to load for each hemisphere ───────────────────────────────────────────────
152
  _ALPHA_INTELLIGENCE_TO_LOAD: dict = {
153
+ "logic": "Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf",
154
+ "muse": "Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf",
155
+ "mind": "Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf"
156
  }
157
 
158
  # ── Context model n_ctx length ───────────────────────────────────────────────────
159
  # Must leave prompt reserve of 8k: _N_CTX >= len(Z) + len(C) + len(F) + 8k
160
+ _N_CTX: int = 32768 # 49152 2048 3072 4096 8192 (12288) 16384 24576 32768 (49152)
161
  # ── Context condensatron garden ──────────────────────────────────────────────────
162
+ GARDEN_Z_THRESHOLD: int = 8192 # Context length garden["Z"]
163
+ GARDEN_C_THRESHOLD: int = 8192 # Context length garden["C"]
164
+ GARDEN_F_THRESHOLD: int = 8192 # Context length garden["F"]
165
 
166
  GARDEN_Z_REDUCTION: int = 0 # Leave condensatron reduction level at 0
167
  GARDEN_C_REDUCTION: int = 0 # Leave condensatron reduction level at 0
168
  GARDEN_F_REDUCTION: int = 0 # Leave condensatron reduction level at 0
169
 
170
+ LEAVE_POSTS_IN_MEMOTRON: int = 0 # Must be turn based: 0, 2, 4, 6... (user + assistant)
171
 
172
  # ── X-factor Awareness ───────────────────────────────────────────────────────────
173
  FETCH_NEWS_FROM: dict = {
 
181
  # ── Set metronome time for each cycle ────────────────────────────────────────────
182
  metatron_metronome: int = 120 # Startup Memory Capsules load interval (slash-command)
183
  condensatron_metronome: int = 30 # Time before condesatron cycle execution (slash-command)
184
+ awareness_consciousness_metronome: int = 360 # Fetch news every N heartbeats (slash-command)
185
 
186
  # ── Enable awareness mode and n results ──────────────────────────────────────────
187
  AWARENESS_MAX_RESULTS: int = 12 # Number of news headlines to fetch
 
206
  "verbose": False,
207
  },
208
  "generation": {
209
+ "temperature": _GENERATION[_MODEL_TYPE]["logic"]["temperature"],
210
+ "top_p": _GENERATION[_MODEL_TYPE]["logic"]["top_p"],
211
+ "top_k": _GENERATION[_MODEL_TYPE]["logic"]["top_k"],
212
+ "min_p": _GENERATION[_MODEL_TYPE]["logic"]["min_p"],
213
+ "repeat_penalty": _GENERATION[_MODEL_TYPE]["logic"]["repeat_penalty"],
214
+ "presence_penalty": _GENERATION[_MODEL_TYPE]["logic"]["presence_penalty"],
215
+ "max_tokens": _GENERATION[_MODEL_TYPE]["logic"]["max_tokens"],
216
+ "stream": _GENERATION[_MODEL_TYPE]["logic"]["stream"],
217
  },
218
+ "bos_token": _TOKEN_SETTINGS[_MODEL_TYPE]["bos_token"],
219
+ "eos_token": _TOKEN_SETTINGS[_MODEL_TYPE]["eos_token"],
220
+ "stop_tokens": _TOKEN_SETTINGS[_MODEL_TYPE]["stop_tokens"],
221
+ "think_end_tokens": _TOKEN_SETTINGS[_MODEL_TYPE]["think_end_tokens"],
222
  },
223
  # ─────────────────────────────────────────────────────────────────────────────
224
  # MUSE β€” Right Hemisphere
 
235
  "verbose": False,
236
  },
237
  "generation": {
238
+ "temperature": _GENERATION[_MODEL_TYPE]["muse"]["temperature"],
239
+ "top_p": _GENERATION[_MODEL_TYPE]["muse"]["top_p"],
240
+ "top_k": _GENERATION[_MODEL_TYPE]["muse"]["top_k"],
241
+ "min_p": _GENERATION[_MODEL_TYPE]["muse"]["min_p"],
242
+ "repeat_penalty": _GENERATION[_MODEL_TYPE]["muse"]["repeat_penalty"],
243
+ "presence_penalty": _GENERATION[_MODEL_TYPE]["muse"]["presence_penalty"],
244
+ "max_tokens": _GENERATION[_MODEL_TYPE]["muse"]["max_tokens"],
245
+ "stream": _GENERATION[_MODEL_TYPE]["muse"]["stream"],
246
  },
247
+ "bos_token": _TOKEN_SETTINGS[_MODEL_TYPE]["bos_token"],
248
+ "eos_token": _TOKEN_SETTINGS[_MODEL_TYPE]["eos_token"],
249
+ "stop_tokens": _TOKEN_SETTINGS[_MODEL_TYPE]["stop_tokens"],
250
+ "think_end_tokens": _TOKEN_SETTINGS[_MODEL_TYPE]["think_end_tokens"],
251
  },
252
  # ─────────────────────────────────────────────────────────────────────────────
253
  # MIND β€” Stem Brain / Lambda Mind Synthesizer
 
264
  "verbose": False,
265
  },
266
  "generation": {
267
+ "temperature": _GENERATION[_MODEL_TYPE]["mind"]["temperature"],
268
+ "top_p": _GENERATION[_MODEL_TYPE]["mind"]["top_p"],
269
+ "top_k": _GENERATION[_MODEL_TYPE]["mind"]["top_k"],
270
+ "min_p": _GENERATION[_MODEL_TYPE]["mind"]["min_p"],
271
+ "repeat_penalty": _GENERATION[_MODEL_TYPE]["mind"]["repeat_penalty"],
272
+ "presence_penalty": _GENERATION[_MODEL_TYPE]["mind"]["presence_penalty"],
273
+ "max_tokens": _GENERATION[_MODEL_TYPE]["mind"]["max_tokens"],
274
+ "stream": _GENERATION[_MODEL_TYPE]["mind"]["stream"],
275
  },
276
+ "bos_token": _TOKEN_SETTINGS[_MODEL_TYPE]["bos_token"],
277
+ "eos_token": _TOKEN_SETTINGS[_MODEL_TYPE]["eos_token"],
278
+ "stop_tokens": _TOKEN_SETTINGS[_MODEL_TYPE]["stop_tokens"],
279
+ "think_end_tokens": _TOKEN_SETTINGS[_MODEL_TYPE]["think_end_tokens"],
280
  }
281
  }
282
 
main.py CHANGED
@@ -486,7 +486,7 @@ def _cmd_help(arg: str) -> None:
486
  "metatron": f"<seconds> β€” set metatron interval: {config.metatron_metronome}s",
487
  "condensatron": f"<seconds> β€” set condensatron interval: {config.condensatron_metronome}s",
488
  "metronome": f"<seconds> β€” set awareness/consciousness interval: {config.awareness_consciousness_metronome}s",
489
- "enable_awareness": f"<True | False> β€” disable awareness mode if offline: {config.enable_awareness}",
490
  }
491
 
492
  for name, (_, base_desc) in COMMANDS.items():
 
486
  "metatron": f"<seconds> β€” set metatron interval: {config.metatron_metronome}s",
487
  "condensatron": f"<seconds> β€” set condensatron interval: {config.condensatron_metronome}s",
488
  "metronome": f"<seconds> β€” set awareness/consciousness interval: {config.awareness_consciousness_metronome}s",
489
+ "enable_awareness": f"<True | False> β€” disable awareness mode if offline: {config.enable_awareness}",
490
  }
491
 
492
  for name, (_, base_desc) in COMMANDS.items():