# dsh-custom-provider

直接集成到 DeepSeek Harness 官方 **模型**设置页的模型工具。

[English](../README.md)

提供方、凭据、模型列表和推理能力由官方界面管理。插件只保留三项能力：

- **models.dev 元数据填充**：填入模型名称、上下文窗口、输出上限和支持的文本/图片输入。
- **单模型 JSON 编辑**：编辑一个模型，保留其他模型和高级字段。
- **配置导入导出**：传输选中的 `llm-pi-ai` 提供方配置，不携带凭据值和请求头。

插件不再增加独立设置页面，也不保存另一套模型配置。

## 环境与安装

当前已验证 **DSH 0.2.1-rc.2**，启用 Web Settings 和内置 `llm-pi-ai` 适配器。此版本插件不再支持旧版独立配置页。

```sh
dsh plugin --profile web add dsh-custom-provider
```

本地开发时，在仓库根目录执行：

```sh
dsh plugin --profile web add "$PWD"
```

重启 DSH，打开 **设置 → 模型**。提供方、密钥和模型的常规管理继续使用官方卡片。

## 模型增强

在官方提供方卡片点击 **编辑**，展开某个模型的 **模型选项**，即可在该模型详情中看到 **从 models.dev 拉取**和内嵌的 **编辑 JSON**。不再弹出独立的模型工具窗口，也不需要再次选择模型。新建自定义提供方时使用相同的行内工具。

拉取会同时更新当前模型的官方表单字段和 JSON，暂不写入配置。只填充 `name`、`contextWindow`、`maxTokens` 和支持的 `input`，不会改写 `reasoningEfforts`、`compat`、协议和凭据。匹配优先使用原始完整模型 ID，然后识别官方提供方，最后采用首个匹配的裸模型 ID。请求使用六小时内存缓存；更新失败不会导入过期数据。

JSON 有效时，修改会立即同步到官方表单已有的模型 ID、名称、容量、输入类型和推理配置。没有对应控件的字段（例如 `compat`）保留在同一份模型草稿中，通过官方提供方的 **保存**按钮一并写入。无需再点击“应用到表单”，也不会实时写配置文件；高级字段是否受支持仍以适配器的 schema 和运行逻辑为准。

输入 JSON 时保留原有空白和光标位置，普通表单修改也会自动同步回 JSON。JSON 未完成或可见字段的值无效时，表单保留最后一次有效状态，编辑原文不丢失，修正或重置前不能保存提供方。JSON 未完成期间修改普通字段，修正后会合并互不冲突的修改；同一字段两边都改动时，明确指出冲突并保留草稿。**重置 JSON**恢复的是当前表单草稿，并非上一次保存的配置。收起模型仍保留 JSON 原文，拉取未完成时也会暂时阻止保存。

官方编辑器继续负责提供方草稿、schema 校验、继承模型处理、持久化和版本冲突。拉取或编辑 JSON 不单独写配置，其他模型和提供方字段的未保存修改仍处于同一份草稿中。保存被适配器拒绝或发生版本冲突时，官方表单会保留编辑内容并显示错误。

DSH 当前没有模型详情和页面标题的公开扩展位，因此此版本对已注册的官方模型组件进行局部适配，保留原 section、依赖注入、子 slot 归属、控制器、表单和保存操作，不修改已安装的客户端。兼容性同时依赖官方组件结构，升级 DSH 后需要重新运行真实页面测试，不能只根据版本号推断兼容。

## 配置传输

官方模型页标题右侧依次提供 **导入配置**和 **导出配置**，与旧版插件的工具栏位置和顺序一致。预览区在标题下方展开。

导出从生效的 `llm-pi-ai.providers` 配置中选择提供方，兼容官方页面配置和基础层继承配置。文件不包含 API Key 值和自定义请求头，排除 `deepseek-account`、`deepseek-official`。接口 URL 可能包含敏感参数，请妥善检查和保管文件。

导入继续兼容原有版本 1 的 `dsh-custom-provider/providers` JSON 格式。预览展示源端和目标端模型数量，以及新增、用户配置、继承或分层状态。已有提供方默认 **跳过**，新增提供方默认 **导入**；选择 **替换**会更新传输的提供方字段及模型列表，同时保留目标端已有请求头。不修改未选择的提供方和凭据库。

文件会保留 `apiKeyEnv` 引用名，因此导入后可能使用目标端已有凭据。缺失密钥通过官方页面配置。基础层与安装的模型目录仍会参与最终配置合成。

模型修改沿用官方表单的保存流程；导入通过官方设置服务提交，使用宿主 schema 和导入预览对应的 revision。文件不兼容或版本已过期时明确拒绝，不静默适配。

## 从旧版升级

已有提供方和模型一直存储在官方 `llm-pi-ai` 命名空间中，无需迁移。旧的 **模型配置**导航入口会移除。插件不再编辑凭据和 profile 注册，也不再提供提供方管理、接口模型发现和独立推理表单。

包名继续保留 `dsh-custom-provider`，已有安装可以原位升级。保持插件自身只注册一次，无需为插件额外插入 `llm-pi-ai` 适配器。

## 开发与验证

```sh
pnpm install
npm run build
npm test
npm pack --dry-run --json
```

`lib/client.js` 由 `lib/client.source.js`、`lib/config.js`、`lib/modelsdev.js` 和 `lib/official-models.js` 生成并提交，因为 DSH 直接加载它。测试加载固定版本的官方模型页组件，覆盖原生表单与 JSON 同步、官方保存、草稿与版本冲突、导入导出边界、适配层卸载恢复，以及真实 DSH 设置服务的持久化。

浏览器验收使用隔离目录：

```sh
preview_home="$(mktemp -d "${TMPDIR:-/tmp}/dsh-model-tools.XXXXXX")"
DSH_HOME="$preview_home" dsh --profile web --patch "$PWD/test/local.patch.yml" --no-open --port 0
```

## 来源与许可

本项目基于 [Luck9Star/dsh-gateway-provider](https://github.com/Luck9Star/dsh-gateway-provider) 开发，保留原有 MIT 许可和版权声明，见 [LICENSE](../LICENSE)。
