# dsh-model-manager

[English](README.md) | 中文

`dsh-model-manager` 提供独立的“模型中心”设置页，并与 DeepSeek Harness 官方模型设置页和模型选择器共享模型元数据。第一阶段不替换 `llm-pi-ai`、凭据、首次引导、官方模型选择器或 `@deepseek-ai/dsh-tool-fs`。

## 功能

- 为模型增加标签；比较时不区分大小写，显示时保留第一次输入的写法。
- 在 **设置 → 模型中心** 中按提供方集中维护标签和图片代理；它与官方模型页并存，并写入同一份 manager 元数据。
- 通过官方 `reasoningEfforts` 字段配置 `off`、`minimal`、`low`、`medium`、`high`、`xhigh` 和 `max`。
- 通过模型官方 `input` 字段修改图片输入能力。
- 为纯文本模型指定一个明确且原生支持图片的代理模型。
- 在官方模型选择器中按一个或多个标签筛选，多个标签采用任一匹配。
- 上传转录与 `read_image` 在会话、图片、路由、关注点和提示模板版本相同时共用代理结果。

宿主的模型发现弹窗会让每次新发现的模型默认全部不选，并提供“全选”和“清空”。这些交互属于兼容宿主，不写入本插件元数据。

## 兼容性

本插件要求 DeepSeek Harness 提供 `ctx.imageInput`、可叠加的模型设置扩展槽和模型选择筛选扩展槽。不包含这些 API 的已发布旧宿主不兼容，启用插件前需要升级宿主。Host 服务显式依赖 `imageInput`、`attachments` 和 `llm`，缺少公开服务时 Cordis 不会激活插件。

## 演进边界

模型中心目前只拥有本插件的标签和图片路由元数据，运行时模型目录仍由已加载的 LLM 适配器公开。它不会复制模型路由、OAuth 令牌或宿主凭据；后续 OAuth 提供方将以独立贡献方式接入模型中心，保留各自的协议和模型适配器实现。

提供方插件可以从 `dsh-model-manager/client` 注册 `registerModelCenterExtension()`，把登录、账号或提供方专属配置渲染到独立页面；manager 核心不需要增加提供方分支。

## 图片路由

模型原生图片能力始终优先。来源模型不支持图片时，插件只使用为它明确配置的代理，不搜索或猜测其他模型。代理目标必须存在、不能是来源模型本身，并且必须直接声明支持图片；不允许代理链或递归代理。

上传的原图原样保留在持久用户消息中。发送给供应商之前，插件记录一条可回放的代理观察，并且只从纯文本模型收到的出站副本中移除图片块。`read_image` 接受可选 `focus`，代理模式返回文字观察，不把原图注入纯文本模型上下文。

代理调用复用 Harness 的 LLM 和凭据服务。当前轮次取消会传递到代理请求，`proxyTimeoutMs` 提供额外超时上限。代理失败时明确报错，不换其他模型重试。

## 配置

```yaml
- insert:
    - id: dsh-model-manager
      name: dsh-model-manager
      config:
        proxyTimeoutMs: 60000
        # metadataPath: D:/dsh/model-manager.json
        # dshHome: D:/dsh-home
```

元数据默认保存在 `<DSH_HOME>/plugins/dsh-model-manager/config.json`。写入采用原子替换和单调递增的 `revision`；旧页面提交时会被拒绝，不会覆盖新页面已经保存的内容。

## 浏览器持久化

标签筛选属于普通的全局界面状态，使用键 `dsh.model-manager.selector.global.tags.v1`。浏览器存储无效或不可用时降级为不筛选。模型标签、思考档位、图片能力、代理路由、凭据和表单草稿都不会写入浏览器存储。

## 开发验证

```sh
pnpm run typecheck
pnpm test
pnpm run build
pnpm run pack:check
```
