---
name: config
description: 配置向导技能。当用户输入 "/config" 且没有任何其他内容时触发。用于重新配置 LLM provider（BASE_URL / API_KEY / MODEL）。
---

# Config Skill

当用户**只输入 `/config`** 时（不带任何其他内容）触发，引导用户重新配置 LLM provider。

使用 Read 读现有配置（如有），逐项询问用户新值（允许保留旧值），最后用 Write 工具写入 `~/.minimal-agent/config.json`，并提示用户重启 minimal-agent 使新配置生效。

⚠️ 重要：本技能仅在用户**精确输入 `/config`**（前后无任何其他文字）时触发。如果用户的消息里包含其他内容（例如 "/config 帮我看下"、"我想 /config 一下"），不要触发，按普通对话回应。

---

## 执行步骤

### Step 1: 读取现有配置

调用 Read 工具：

```
Read({ file_path: "~/.minimal-agent/config.json" })
```

- 文件存在 → 解析 JSON，记住当前的 `baseURL` / `apiKey` / `model` / `provider` / `contextWindow` 字段
- 文件不存在 → 这是首次手动配置，所有字段都是空

⚠️ 注意：用户的 home 目录路径需要展开（`~` → 实际路径）。Read 工具会自动处理，但若失败，尝试用 `process.env.HOME` 或 `process.env.USERPROFILE`（Windows）拼路径。

### Step 2: 逐项询问用户

依次询问以下字段，每项展示当前值（若有），并明确说明可以"直接回车保留当前值"：

| 字段 | 必需 | 说明 |
|---|---|---|
| `baseURL` | ✅ | OpenAI 兼容 API 的 base URL，如 `https://api.minimax.chat/v1` |
| `apiKey` | ✅ | API key（敏感信息） |
| `model` | ✅ | 模型 id，如 `MiniMax-M2.7` |
| `provider` | ⬜ | 显示名（仅用于状态栏），默认 `env` |
| `contextWindow` | ⬜ | 模型上下文窗口（token 数），**推荐值见下方速查表**（按 provider+model 推断） |
| `tavilyApiKey` | ⬜ | Tavily key（WebSearch 工具用）；可留空跳过，免费 key 申请见 https://tavily.com/ |

### Provider 默认值速查表（contextWindow）

权威值见 `src/cli/configWizard.tsx::PRESETS`；本表是它的镜像，发现不一致以代码为准。

| Provider | Model | 推荐 contextWindow |
|---|---|---|
| minimax | MiniMax-M2.7 / MiniMax-M1 / abab6.5s-chat | 204800 |
| deepseek | deepseek-chat / deepseek-reasoner | 128000 |
| openai | gpt-4o / gpt-4o-mini | 128000 |
| moonshot | moonshot-v1-8k | 8000 |
| moonshot | moonshot-v1-32k | 32000 |
| moonshot | moonshot-v1-128k | 128000 |
| volces | doubao-seed-2.0-pro / glm-5.1 / kimi-k2.6 / deepseek-v3.2 / minimax-latest | 204800 |
| 其它 / custom | — | 128000 |

⚠️ 火山方舟 ARK Coding Plan：一个 endpoint (`https://ark.cn-beijing.volces.com/api/coding/v3`) 后挂多个 model，**model 字段大小写严格匹配**（`glm-5.1` 而非 `GLM-5.1`）。常见 model id 见 `src/cli/configWizard.tsx::PRESETS` 的 `volces` 项；部分 model（如 `glm-5.1`）走 draft-2020-12 严校验，由 `src/utils/zodToJson.ts::modernizeExclusiveBounds` 透明兼容。

⚠️ 询问 `contextWindow` 时，**先按上表给出推荐值并明确告诉用户**（例：「按你选的 `MiniMax-M2.7`，推荐 `contextWindow = 204800`，直接回车采纳」）。**不要让用户裸填 token 数**；用户主要关心 `baseURL` / `apiKey` / `model`，contextWindow 应优先按 provider+model 推断。

如果用户改了 model 但没改 contextWindow，**主动重新计算推荐值**并提示；用户旧 contextWindow 与新 model 不匹配时（如把 model 从 `moonshot-v1-8k` 改成 `moonshot-v1-128k`），明确建议同步更新。

**对话格式示例**（每次只问一个字段，等用户答完再问下一个）：

```
当前 baseURL: https://api.minimax.chat/v1
请输入新的 baseURL（直接回车保留当前值）：
```

如果用户回车直接发空消息，保留旧值。

### Step 3: 写入配置

收齐所有字段后，构造完整 JSON 对象并用 Write 工具写入：

```
Write({
  file_path: "~/.minimal-agent/config.json",
  content: JSON.stringify({
    baseURL: <...>,
    apiKey: <...>,
    model: <...>,
    provider: <...>,
    contextWindow: <...>,
    tavilyApiKey: <... or 省略字段>,
    savedAt: Date.now()
  }, null, 2)
})
```

字段 `savedAt` 必须是当前的 unix 毫秒时间戳。

`tavilyApiKey` 字段策略：
- 用户没有 Tavily key → **从写入的 JSON 里删掉这个字段**（不要写空串，readSavedConfig 会拒空串）。
- 用户提供了 key → 写入字符串。
- 用户没主动改这个字段 → **保留旧值**（不要为了"格式整洁"删除）。
- 写入后启动注入：下次启动 minimal-agent 时 `applyToolKeysToEnv()`（`src/config.ts`）会把它注入 `process.env.TAVILY_API_KEY`，WebSearch 工具就能用了。

### Step 4: 提示重启

写入成功后，输出（中文）：

```
✅ 配置已更新到 ~/.minimal-agent/config.json

⚠️ 当前会话仍在使用旧配置。请按以下步骤让新配置生效：
  1. 按 Ctrl+C 退出 minimal-agent
  2. 重新运行（bun run start / minimal-agent / bun run src/main.tsx）

如果不想等重启，也可以临时 `export MINIMAL_AGENT_BASE_URL=... API_KEY=... MODEL=...`
再重新运行 —— 环境变量始终优先于配置文件。
```

---

## 不做的事

- ❌ 不要主动调用 LLM API 测试新配置 —— 这可能用旧配置去打新地址，混乱
- ❌ 不要修改 `.env` 文件 —— 那是用户的私有文件，由用户自己管
- ❌ 不要在用户输入 `/config 帮我...` 等带其他内容的消息时触发本技能
- ❌ 不要试图"热重启"或重新加载 provider —— 重启进程是最可靠的方式
