# 模型管理

每項模型與憑證操作，及其對應的 TUI 指令與 HTTP 端點。

一切由 TUI 或本機 HTTP API 管理——沒有 `agen model` CLI 子指令：

| 工作 | TUI | HTTP |
|---|---|---|
| 新增 / 移除供應商或模型 | `/model` → `add`；在模型列按 `d` 移除 | `POST` `/v1/models`、`DELETE` `/v1/models/*name` |
| 調整 fallback 優先序 | — | `GET` `POST` `/v1/model/priority` — `{models}` |
| 設定模型 tier | `/model`，在模型列按 `t` | `POST` `/v1/model/tier` — `{model, tier}` |
| 選擇 dispatcher 模型 | `/model` → `dispatch` | `GET` `POST` `/v1/model` — `{dispatcher}` |
| 選擇 session 的 reasoning 等級 | `/model` → `reasoning`（或 `Shift+A` / `Shift+D`） | `POST` `/v1/session/:id` — `{reasoning}` |
| 選擇 summary 模型 | `/model` → `summary` | `GET` `POST` `/v1/model` — `{summary}` |
| 選擇圖像產生器 | `/model` → `image` | `GET` `POST` `/v1/model` — `{image}`，填 provider 端點而非模型名稱 |
| 選擇 speech-to-text 模型 | `/model` → `stt` | `GET` `POST` `/v1/model` — `{stt}`，取值來自 `GET /v1/model/audio` |
| 選擇 text-to-speech 模型 | `/model` → `tts` | `GET` `POST` `/v1/model` — `{tts}`，取值來自 `GET /v1/model/audio` |
| 選擇 session 使用的模型 | `/model`（或以 `Shift+W` / `Shift+S` 在 `auto` 與已註冊模型間輪替） | `POST` `/v1/session/:id` — `{model, reasoning}` |
| 儲存憑證 | `/key` | `POST` `/v1/provider/:provider/key` |
| OAuth 登入 | `/model` | `GET` `/v1/provider/:provider/oauth`（SSE device code） |
| 清除 OAuth 登入 | `/model` | `DELETE` `/v1/provider/:provider/oauth` |
| 查詢額度 / 餘額 | `Shift+U` | `GET` `/v1/providers/quota`；單一模型所屬供應商：`GET` `/v1/model/quota?model=<name>` |

模型路由是單一物件：`GET` / `POST` `/v1/model` 一併讀取與部分更新 `dispatcher`、`summary`、`image`、`stt` 與 `tts`。未帶到的欄位不動，`""` 為清除。寫入 `config.json` 時對應 `dispatcher_model`、`summary_model`、`image_generator`、`stt_model` 與 `tts_model`。

音訊路由與模型註冊表分離。`stt` 與 `tts` 不是從 `/model add` 註冊過的模型中挑選，而是向目前握有憑證的 OpenAI、Gemini 與 OpenRouter 即時查詢；現階段也只有這三家支援音訊（OpenRouter 於 v1.0.17 加入）。`tts` 選 `off` 會同時把 `generate_audio` 從工具集中移除；`stt` 選 `off` 則讓 `read_files` 不再轉錄音訊與影片，Telegram / Discord 收到的語音訊息也會直接回覆提示要先選模型。

憑證（API key、OAuth token）存放於 OS keychain 的 `agenvoy` 服務，絕不寫入純文字 JSON。`config.json` 的 `keys` 只記錄已儲存的 key 名稱。

Daemon 監看 `config.json`；寫入後會重新載入 agent registry（並重連 Telegram / Discord），不需重啟。

自 v1.0.13 起 registry 條目只持有模型名稱，改為每次 `Send` 時才解析 provider config，不再於啟動時建好 client，因此 keychain 內更新過的 OAuth token 下一次請求即生效，不必等 registry 重新載入。
