DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Model Palette — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
M

dsh-model-palette

Model Palette

DeepSeek Harness 的全局模型命令面板和提供商/模型配置面板,包含可视化提供商目录、启动时 OpenRouter 免费模型同步、选择性请求重试、回环中继、在线容量预设和可选媒体工具。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:Jensen-Yao/dsh-model-palette#aaaa7e568e55d4ee0befbcbd7bd7a86d52f344da
README兼容性版本

兼容性与来源证明

Model Palette 以 dsh-model-palette 发布,当前版本为 0.15.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/9/20

版本

0.15.1stable
2026/9/20
0.15.0stable
2026/9/20
0.14.0stable
2026/9/19
查看其余 19 个版本收起版本
0.12.2stable
2026/9/19
0.11.0stable
2026/9/19
0.10.3stable
2026/9/1
0.10.2stable
2026/8/31
0.10.1stable
2026/8/29
0.9.3stable
2026/8/29
0.9.1stable
2026/8/29
0.8.0stable
2026/8/29
0.7.1stable
2026/8/28
0.7.0stable
2026/8/28
0.6.0stable
2026/8/28
0.5.5stable
2026/8/28
0.5.4stable
2026/8/27
0.5.3stable
2026/8/27
0.5.1stable
2026/8/27
0.5.0stable
2026/8/26
0.4.0stable
2026/8/26
0.3.0stable
2026/8/26

相关插件

正在加载相关插件…

最新版
0.15.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 1
周下载
0
最近提交
2026/9/20
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题
0.2.0
stable
2026/8/26

相关插件

继续浏览 models-usage 分类下经过校验的插件。

Usage@linxin666/dsh-usage用于 dsh Web GUI 的使用统计插件:检测各提供商的余额和编码计划配额,并提供实时令牌使用记录,同时在侧边栏条目中显示当前会话提供商今日的使用量Whale Widgetdsh-whale-widgetDSH Web 界面右下角的 DeepSeek 余额小鲸鱼挂件:余额/今日已用/峰谷定价、自定义泡泡点击序列(文本/余额/今日/峰谷/图片/随机语句与并列加权选择)、逐行样式与字体、悬浮快捷编辑、音效与每轮消耗、自定义角色/动图/音效、吸附与翻转自定义Usage Stats@ychris12138/dsh-usage-statsdsh Web GUI 的令牌使用热力图、提供商余额和订阅配额Codex Connectdsh-codex-connect用于 DeepSeek Harness 的 ChatGPT OAuth 和 Codex 模型。

README

DSH Model Palette

dsh-model-palette

Global provider-aware model command palette for DeepSeek Harness Web

Alt+M  ·  Fuzzy search  ·  Provider filter  ·  Model config  ·  OpenRouter media


dsh-model-palette is a plugin for DeepSeek Harness that replaces the native model selector with a powerful, global command palette. Press Alt+M from anywhere in the Web UI — or click the composer trigger — and instantly search, filter, favorite, and switch models across all your providers.

Project site: jensen-yao.github.io/dsh-model-palette

Current release: v0.12.0

v0.11.0 targets @deepseek-ai/dsh@0.1.6-alpha.2: the configuration panel gains a visual provider card catalog with template-based creation, OpenRouter free routes can auto-sync the live :free catalog on startup and on an interval, and the preset registry expands to 281 vendor-authoritative entries.

✨ Features

🎯 Global Command Palette

  • Alt+M shortcut works from anywhere
  • Renders in a document-level dialog independent from the composer layout
  • One unified fuzzy search over model names, model IDs, provider names, and provider IDs
  • Arrow-key navigation and Enter to select

🏷️ Provider Filter Rail

  • Side rail lists every provider with live model counts
  • Click any provider to filter; click "All providers" to reset
  • Current provider auto-highlighted at the top
  • Visual indicators for provider catalog errors

⭐ Favorites & Recents

  • Star any model to add it to favorites
  • Recently used models are ranked first
  • Current model always pinned at the top
  • Dedicated Favorites only and Recent models quick filters
  • Persisted in localStorage across sessions

🧠 Universal Reasoning Effort Selector

  • The footer always offers off, minimal, low, medium, high, xhigh, and max
  • If a model does not advertise levels yet, choosing one creates a live reasoningEfforts declaration before selection
  • Configure every level and provider wire value per model, or enable all declared models on a route with one click
  • Provider-aware defaults cover OpenAI, OpenRouter, DeepSeek, Qwen, GLM/Z.AI, Together, and manual gateways

⚙️ Provider & Model Configuration

Add, edit, or remove provider profiles directly from the UI:

  • Visual provider catalog: configured routes render as a searchable card grid with brand icons, model counts, and protocol badges
  • Template gallery: custom (OpenAI Compatible / Responses / Anthropic), OAuth subscription, and API-key templates that prefill endpoint, protocol, and credential reference on click
  • Configure provider ID, display name, base URL, and protocol (openai-completions, openai-responses, anthropic-messages)
  • New OpenAI-compatible provider drafts default to openai-responses
  • Classify explicit models, live DSH catalog models, and modelOverrides with real Responses and Chat Completions requests, then explicitly split Completions-only models into a generated provider-completions route
  • Keep provider-only edits catalog-backed through modelOverrides; model edits and protocol splits safely materialize the complete catalog with resolved capacities and input modalities
  • Set credential reference and API key (masked by default)
  • Validate every configured runtime key in one click and jump directly to any provider that needs editing
  • Test connection via llm.discoverModels; discovered models are immediately added and enriched with live metadata plus exact presets
  • On OpenRouter routes, Check free models opens a searchable live :free catalog, and free-route auto sync replaces the route with the live free catalog on DSH startup and on a configurable interval — free models only, with manual capacities and compatibility fields preserved and one-click "sync now"
  • Duplicate a working provider into a new draft with a separate credential reference
  • Duplicate model parameters, filter long model lists, and reject duplicate model IDs before saving
  • Auto-repair known DeepSeek-dialect replay fields before switching models on custom OpenAI-compatible gateways
  • List affected models missing thinkingFormat / reasoning_content replay settings and provide one-click repair in the config panel
  • Configure transient request retries per provider and override them per model; B.AI and BankOfAI aliases start at 50 retries
  • Keep unselected routes on their existing DSH recovery policy and never retry permanent 401, quota, request, missing-model, or context-limit failures

🖼️ OpenRouter Media Tools (Optional)

  • Image generation — select a model, write a prompt, generate directly
  • Video generation — submit async jobs with duration control
  • Job management — check status and download completed videos
  • All actions run without sending prompts to the conversation
  • Paid generation blocked by default; configurable

🔒 Safety & Privacy

  • API keys masked by default; stored in DSH credentials service
  • Credential reveal restricted to loopback connections only
  • Cross-site request forgery protection on all plugin APIs
  • OpenRouter credential never returned to the browser
  • One-time charge acknowledgement for non-free media models

🚀 Quick Start

Install

dsh plugin --profile web add github:Jensen-Yao/dsh-model-palette#v0.12.0

Restart dsh web, then press Alt+M or click the model trigger in the composer area.

Enable OpenRouter Media Tools (Optional)

Media tools are enabled by default with zero configuration: they reuse the OPENROUTER_API_KEY already stored in your DSH credentials (the same key your OpenRouter chat routes use) and write outputs to ~/.dsh/media-output. Free image/video endpoints are used automatically; paid generation asks for per-run confirmation in the panel unless you allow it in config.

Opt out or customize via a profile patch — every field is optional:

# cordis.patch.yml or your profile patch file
- id: dsh-model-palette
  config:
    openrouterMedia:
      enabled: false                # set false to turn the tools off
      credentialRef: OPENROUTER_API_KEY   # any DSH credential reference
      outputDir: 'D:\AI\openrouter\outputs'
      allowPaidImages: false
      allowPaidVideos: false
      preferredImageModels: []
      preferredVideoModels: []

If the key is missing you get a clear Credential OPENROUTER_API_KEY is not configured in DSH message — add it on the config panel like any other provider key.

This registers five agent tools:

ToolDescription
openrouter_media_modelsBrowse live OpenRouter image/video models and pricing
openrouter_generate_imageGenerate images via OpenRouter
openrouter_generate_videoSubmit asynchronous video generation
openrouter_video_statusPoll a video job's status
openrouter_download_videoDownload a completed video to the configured output directory

B.AI direct-connection recovery without a VPN

If https://api.b.ai/v1/models times out locally while the key is known to be valid, the network is usually blocking the api.b.ai DNS or TLS route rather than rejecting the key. The plugin includes a loopback-only B.AI relay: it forwards DSH /v1/* requests through a reachable B.AI entry while using the api.b.ai host and certificate name. No VPN is required, and the key remains in DSH credentials. “Switching strategy” always stays inside B.AI: the provider, model, API key, and request path remain unchanged; only the connection host, DNS address, or direct-versus-accelerator route changes. The relay opens a fresh HTTPS socket for every attempt, dynamically resolves and rotates DNS addresses, and moves replayable requests to the next B.AI strategy after a transient failure. Press Alt+M and open Relay config to copy a 127.0.0.1 Base URL and provider template using the current DSH port.

Change the affected B.AI provider baseURL to the following value and restart dsh web:

llm-pi-ai:
  providers:
    bailsb:
      apiKeyEnv: BAILSB_API_KEY
      api: openai-responses
      baseURL: http://127.0.0.1:3080/model-palette/api/bai-relay/v1
      models:
        - id: deepseek-v4-flash
    baiwhr:
      apiKeyEnv: BAIWHR_API_KEY
      api: openai-responses
      baseURL: http://127.0.0.1:3080/model-palette/api/bai-relay/v1
      models:
        - id: deepseek-v4-flash

The relay accepts only direct 127.0.0.1 / ::1 requests and has a fixed B.AI destination; it is not an open proxy. Its default strategies are: the current DNS address for the AWS Global Accelerator entry, the next address for that same accelerator hostname, and direct api.b.ai. 503, 502, 504, explicit Cloudflare 403 pages, rate limits, and transient socket failures move to the next B.AI strategy; the relay returns 503 UPSTREAM_TRANSIENT only after all attempts fail. A 401 from /v1/models means the request reached B.AI, so check the credential first. Large non-replayable requests preserve the original B.AI HTTP error instead of being replayed. If B.AI changes its accelerator entry, override the full chain with baiRelay.strategies in the plugin configuration.

The built-in relay retry settings belong to the plugin config, not the provider profile:

- id: dsh-model-palette
  config:
    baiRelay:
      upstreamRetries: 2
      retryDelaysMs: [250, 1000]
      retryBodyLimitBytes: 16777216
      strategies:
        - id: aws-global-accelerator
          upstreamHost: a18ccd091ab831ac3.awsglobalaccelerator.com
          hostHeader: api.b.ai
          tlsServerName: a18ccd091ab831ac3.awsglobalaccelerator.com
          certificateHost: api.b.ai
          addressIndex: 0
        - id: aws-global-accelerator-next-address
          upstreamHost: a18ccd091ab831ac3.awsglobalaccelerator.com
          hostHeader: api.b.ai
          tlsServerName: a18ccd091ab831ac3.awsglobalaccelerator.com
          certificateHost: api.b.ai
          addressIndex: 1
        - id: direct-api
          upstreamHost: api.b.ai
          hostHeader: api.b.ai
          tlsServerName: api.b.ai
          certificateHost: api.b.ai
          addressIndex: 0

upstreamRetries is the number of extra attempts for the same B.AI request; the default 2 covers the three strategies above in order. Relay transport recovery and the provider/model request-retry rules below are separate layers, and neither layer switches to another provider.

Extend the relay to another provider

For another provider whose key works but canonical domain is unreachable locally, declare a named fixed-destination relay in plugin configuration. Each relay has an ID, fixed HTTPS connection host, original API Host, TLS SNI, certificate validation name, and allowed path prefix. Browser requests cannot choose an upstream dynamically.

- id: dsh-model-palette
  config:
    providerRelays:
      example-provider:
        upstreamHost: reachable-entry.example.net
        hostHeader: api.provider.example
        tlsServerName: reachable-entry.example.net
        certificateHost: api.provider.example
        allowedPathPrefix: /v1/
        timeoutMs: 180000
        upstreamRetries: 2
        retryDelaysMs: [250, 1000]
        retryBodyLimitBytes: 16777216

After restarting dsh web, set the provider Base URL to http://127.0.0.1:3080/model-palette/api/relay/example-provider/v1. If DSH uses another port, copy the current loopback address from Relay config. Configure only a verified alternate entry for the same provider API; never place an unknown site, secret, or dynamic URL in relay configuration.

🎮 Using the Palette

Basic Usage

ActionHow
Open palettePress Alt+M or click the ⌘ model trigger
Close palettePress Esc or click outside the dialog
SearchType into the search field — matches model name, model ID, provider name, provider ID, and description
Navigate↑ / ↓ arrow keys
SelectEnter on the highlighted row
Filter by providerClick a provider in the left rail
Show favorites onlyClick Favorites only in the left rail
Show recent modelsClick Recent models in the left rail
Toggle favoriteClick the ★ star on any model row
Switch reasoning effortUse the footer dropdown; missing model declarations are added live

Configuration Panel

Press Alt+M and select Model config in the left rail to:

  1. Select or create a provider — choose from the dropdown or click "Add provider"
  2. Duplicate a provider when useful — start from a working route without reusing its credential reference
  3. Configure the endpoint — set base URL, protocol, and credential reference
  4. Manage API keys — enter a new key or load the stored one (loopback only)
  5. Test the connection — click "Check connection" to discover models and immediately fill their disclosed or preset context, output, input, and reasoning metadata
  6. Choose OpenRouter free models — scan the current usable :free catalog, search and inspect capacities, then import only the checked models
  7. Validate the API key — send a minimal request through the selected model and protocol, then distinguish the active DSH runtime credential from a different unsaved key in the input
  8. Check all API keys — sequentially test every configured runtime credential and open a failing provider directly from the results
  9. Test one live model — send one minimal request to /chat/completions and /responses and show which actually works
  10. Check every model protocol — classify explicit models plus live DSH catalog entries and modelOverrides; large providers are scanned in batches and no configuration changes until confirmation
  11. Split Re/CC protocols — keep Responses-capable models on the original provider and create a -completions branch containing only Chat Completions-only models, after resolving capacities and text/image inputs
  12. Configure provider retries — keep the DSH policy or set an exact transient-failure retry count for the route
  13. Override retries per model — inherit, explicitly disable retries, or set a model-only count
  14. Configure models — filter long lists, copy parameters, and set context window, max output, input types, and reasoning wire values
  15. Enable universal reasoning — add all seven DSH levels to one model or every declared model on the route
  16. Apply presets — auto-fill from the registry or select manually
  17. Repair known dialect compatibility — use Repair and apply when a DeepSeek-compatible route lacks historical reasoning_content replay fields; normal model selection also runs the preflight automatically
  18. — duplicate IDs are rejected, and unsaved edits are clearly marked before switching or reloading

API key validation reports whether the credential is usable, invalid, blocked, unavailable, missing, or inconclusive. It never treats a public /models response as proof that a key can run conversations and uses the same streaming mode as DSH conversations. Check all API keys runs real requests sequentially to reduce rate-limit pressure and shows the provider, credential reference, source, protocol, model, and diagnostic. The active DSH runtime credential is tested separately from a different unsaved input key, and all keys stay on the plugin backend. Each request may incur a small charge.

Selective request retry rules live in the plugin's dsh-model-palette settings namespace and apply live. A provider rule owns recovery only for that route; an exact model override wins over it. B.AI/BankOfAI aliases (b.ai, bai, bailsb, baiwhr, and bankofai) default to 50 retries. N means retries after the first failed request, so 50 can produce at most 51 billable attempts. Only transport errors, timeouts, rate limits, server errors, empty responses, and explicit Cloudflare/WAF 403 pages retry. Invalid credentials, quota exhaustion, malformed requests, missing models, and context overflow remain terminal. Setting a model override to 0 explicitly disables recovery for that model; routes without plugin rules continue through the normal DSH recovery chain. These provider/model rules are separate from the relay's own transport recovery: the relay handles socket setup failures before DSH receives a response, while this namespace handles failures reported by the DSH request path.

If an explicit Cloudflare/WAF 403 keeps failing after its retry budget, the failure is relabeled as a provider block so the conversation does not misleadingly report API key is invalid. Retries cannot bypass a permanent WAF rule; request content, size, frequency, account policy, or the gateway itself may still need correction.

Reasoning effort is a model capability declaration, not a protocol selector. New OpenAI-compatible routes start on openai-responses, but real endpoint checks remain authoritative. Check every model protocol sends bounded requests for explicit models and for models inherited from the live DSH catalog, including entries customized through modelOverrides. Models that accept Responses stay on the primary route even when both protocols work; models that reject Responses but accept Chat Completions can be moved, after a preview and confirmation, to a generated collision-safe provider-completions branch. Before a catalog route is split, the plugin resolves installed context capacities, configured output caps, and text/image input modalities from the running adapter and fills exact presets; if that metadata cannot be resolved, it cancels rather than writing an inaccurate branch. Provider-only edits preserve the compact catalog plus modelOverrides; an explicit model edit or split materializes the full list. Undetermined models are never moved automatically. The split preserves the endpoint, credential reference, model capacities, inputs, reasoning declarations, valid compatibility fields, and provider/model retry rules.

OpenRouter free-model discovery uses the public /api/v1/models catalog and accepts only explicit :free variants that produce text and have at least one DSH-supported input (text or image). The check requires no API key and changes no provider settings. The picker leaves everything unchecked by default, supports search and manual selection, previews context/output/input capabilities, and imports only the checked entries. Import fills missing metadata and presets without overwriting manual fields or deleting unselected local models.

Live protocol probing sends real requests capped at 16 output tokens and may incur a small charge. The cap avoids false negatives from gateways that reject one-token probes. Full-catalog checks use batches of at most 100 models per backend request and may send up to two model requests per entry. Authentication failures, WAF blocks, rate limits, server failures, and transport errors are reported as undetermined rather than protocol incompatibility. The plugin never changes protocol based solely on reasoning capability and never writes a split before explicit confirmation.

Media Tools Panel

Press Alt+M and select Media tools in the left rail:

  1. The panel loads the live OpenRouter image/video catalog
  2. Models reported as free run without restrictions
  3. Models not reported as free require a one-time charge acknowledgement for each request
  4. Image generation runs synchronously and saves to the output directory
  5. Video generation submits an async job — check status and download when complete

🛠️ Development

# Clone the repository
git clone https://github.com/Jensen-Yao/dsh-model-palette.git
cd dsh-model-palette

# Install dependencies
pnpm install

# Run type check, tests, and build
pnpm check

# Build only
pnpm build

# Run tests
pnpm test

Prebuilt lib/ files are committed to the repository so GitHub-based installs do not need build scripts.

Project Structure

dsh-model-palette/
├── src/
│   ├── client/              # Frontend React components
│   │   ├── index.tsx        # Client entry point & slot registration
│   │   ├── ModelPalette.tsx  # Main palette component
│   │   ├── ConfigPanel.tsx   # Provider & model config UI
│   │   ├── MediaPanel.tsx    # OpenRouter media tools UI
│   │   ├── model.ts          # Search, ranking, favorites logic
│   │   ├── model-config.ts   # Configuration data utilities
│   │   ├── selection-compatibility.ts # DeepSeek compatibility preflight before selection
│   │   ├── model-presets.ts  # Preset registry management
│   │   ├── config-api.ts     # Config API client
│   │   ├── media-api.ts      # Media API client
│   │   ├── locales.ts        # i18n (en & zh)
│   │   ├── types.ts          # TypeScript types
│   │   └── style.css         # Component styles
│   ├── index.js              # Plugin entry point (server-side)
│   ├── openrouter-media.js   # OpenRouter media backend
│   ├── model-config-api.js   # Model config API backend
│   ├── request-retry-settings.js # Live provider/model retry settings
│   └── media-protocol.ts     # Shared protocol constants
├── assets/
│   ├── icon.svg              # Plugin icon
│   └── model-presets.json    # Bundled model presets
├── docs/
│   └── openrouter-media.zh-CN.md  # Media tools documentation (zh)
├── tests/
│   ├── model.test.ts
│   ├── model-config.test.ts
│   ├── model-presets.test.ts
│   ├── media-api.test.ts
│   ├── model-config-api.test.js
│   └── openrouter-media.test.js
├── lib/                      # Prebuilt output
├── package.json
├── tsconfig.json
├── tsdown.config.ts
└── cordis.patch.yml

📋 Requirements

  • Node.js >= 22.19
  • DeepSeek Harness @deepseek-ai/dsh >= 0.1.2-alpha.3
  • pnpm >= 11.21 (for development)

📄 License

MIT © Jensen Yao


Built with ❤️ for the DeepSeek Harness ecosystem
  • Preserve a gateway-blocked diagnostic when explicit Cloudflare/WAF 403 retries are exhausted
  • Open a dedicated Relay config view from the sidebar to inspect the built-in B.AI route, copy current-port loopback templates, and define fixed-destination relays for other providers
  • Warn before discarding unsaved edits and protect drafts with a browser unload guard
  • Security: stored keys can only be revealed through direct 127.0.0.1 / localhost access
  • 📦 Model Presets

    • 469 bundled presets (v4): vendor-authoritative data harvested from the DSH 0.1.6 built-in pi-ai catalog, covering OpenAI, Anthropic, Google, DeepSeek, Moonshot, Z.AI, MiniMax, Qwen, xAI, Xiaomi, and OpenRouter exclusives
    • Online refresh from GitHub — always up-to-date
    • Auto-fill missing parameters for exact model matches
    • Searchable selection: presets render through an input + datalist filter instead of a 281-option dropdown
    • Inline context window, output cap, and reasoning-level counts on each applied preset
    • Provider default input and per-model input can be set to inherit, text, text + image, or image only
    • Unknown aliases are never guessed — only verified data is applied
    Save safely
  • Delete a provider — remove its settings profile after confirmation; its credential is intentionally kept