SKILL.md

  1---
  2name: updating-llm-client-model-lists
  3description: Synchronizes model configurations across Zed, Crush, Octofriend, and Pi from Plexus' /v1/models endpoint. Use when the user asks to update model lists, sync models, refresh available models, or mentions Plexus model availability.
  4---
  5
  6Updates four LLM client configs from the Plexus proxy's available models.
  7
  8## Network reachability
  9
 101. Ping `harp-willow.snowy-egret.ts.net` once
 112. If unreachable and Tailscale DNS is disabled, enable it:
 12   ```bash
 13   tailscale set --accept-dns=true
 14   ```
 153. Test ping again. If still unreachable, STOP and inform the user
 16
 17Remember to disable after finishing the whole process if it was previously disabled.
 18
 19```bash
 20tailscale set --accept-dns=false
 21```
 22
 23## Fetch Plexus models
 24
 25```bash
 26curl -s http://harp-willow.snowy-egret.ts.net:4000/v1/models | \
 27  jq -r '.data[]
 28    | select(.id | IN("nomic-embed-text-v1.5", "diff-apply", "fix-json") | not)
 29    | [.id, (.name // .id), (.context_length | tostring),
 30       ((.context_length * 0.2 | floor | tostring)),
 31       (if (.supported_parameters | index("tools"))     then "tools"     else "" end),
 32       (if (.supported_parameters | index("reasoning"))  then "reasoning" else "" end),
 33       (if (.architecture.input_modalities | index("image")) then "image" else "" end)]
 34    | @tsv' | column -t -s $'\t'
 35```
 36
 37This should provide all the info you need in a table. The data in this table is the same as what you'd get directly querying Plexus. The display names are the same. You do not need to query Plexus any other way. Review the display names in the table, and if they need modification, make the modification while editing the configs.
 38
 39## Rules
 40
 41- Always exclude `nomic-embed-text-v1.5` (embedding model, not supported by any client)
 42- Exclude `diff-apply` and `fix-json` from Zed, Crush, and Pi because it's only supported by Octofriend
 43- Omit special characters from display names. For example, "MiniMax-M2.7" should become "MiniMax M2.7". "nemotron-3-super" becomes "Nemotron 3 Super".
 44
 45## Update Zed config
 46
 47File: `~/.config/zed/settings.json`
 48
 49Update `language_models.Plexus.available_models[]`. Each entry:
 50
 51```json
 52{
 53  "name": "<id>",
 54  "display_name": "<name>",
 55  "max_tokens": <context_length>,
 56  "max_completion_tokens": <max_completion_tokens>,
 57  "capabilities": {
 58    "chat_completions": true,
 59    "prompt_cache_key": false,
 60    "tools": <true if "tools">,
 61    "parallel_tool_calls": true,
 62    "images": <true if "image">
 63  }
 64}
 65```
 66
 67## Update Crush config
 68
 69File: `~/.local/share/chezmoi/dot_config/crush/crush.json`
 70
 71Update `providers.plexus.models[]`. Each entry:
 72
 73```json
 74{
 75  "id": "<id>",
 76  "name": "<name>",
 77  "context_window": <context_length>,
 78  "default_max_tokens": <max_completion_tokens>,
 79  "can_reason": <true if "reasoning">,
 80  "supports_attachments": <true if "image">
 81}
 82```
 83
 84After editing: `chezmoi apply ~/.config/crush/crush.json`
 85STOP if chezmoi has any output other than success.
 86
 87## Update Octofriend config
 88
 89File: `~/.local/share/chezmoi/dot_config/octofriend/octofriend.json5`
 90
 91Update `models[]`. Each entry:
 92
 93```json
 94{
 95  "nickname": "<name>",
 96  "baseUrl": "http://100.77.116.78:4000/v1",
 97  "model": "<id>",
 98  "context": <context_length>,
 99  "apiEnvVar": "PLEXUS_API_KEY"
100}
101```
102
103Leave `diffApply` and `fixJson` objects unchanged.
104
105After editing: `chezmoi apply ~/.config/octofriend/octofriend.json5`
106STOP if chezmoi has any output other than success.
107
108## Update Pi config
109
110File: `~/.local/share/chezmoi/dot_config/pi/models.json`
111
112Update `providers.plexus.models[]`. Each entry:
113
114```json
115{
116  "id": "<id>",
117  "name": "<name>",
118  "reasoning": <true if "reasoning">,
119  "input": <["text"] or ["text", "image"]>,
120  "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
121  "contextWindow": <context_length>,
122  "maxTokens": <max_completion_tokens>,
123  "compat": {
124    "supportsReasoningEffort": <true if "reasoning">,
125    "supportsDeveloperRole": false
126  }
127}
128```
129
130After editing: `chezmoi apply ~/.config/pi/models.json`
131STOP if chezmoi has any output other than success.