dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH plugin: auto-detect and configure model capabilities (reasoningEfforts + input modalities) for llm-pi-ai. Successor to dsh-reasoning-efforts.
DSH plugin: auto-detect and configure model capabilities (reasoningEfforts + capacities) for
llm-pi-ai. Successor todsh-reasoning-efforts— one panel patches the fields the officialllm-pi-aiUI leaves unconfigurable for self-hosted gateways.
English | 简体中文
The official llm-pi-ai settings page for a custom provider only lets you edit contextWindow. What actually matters for routing stays hidden:
reasoningEfforts) — which off/minimal/low/medium/high/xhigh/max the model accepts, and the wire spelling (max: ultra) each level maps to. Without this the intensity slider says “this model provides no selectable thinking levels”.Vision (input) used to be the second gap, but the official UI declares input modalities itself now — so since 0.2.0 this plugin leaves input strictly alone (existing values are preserved untouched on every save).
If you came from dsh-reasoning-efforts: keep it, it still works. dsh-llm-capabilities serves both endpoints (/model-capabilities/raw-models and legacy /thinking-levels/raw-models) so old clients keep working. New installs should use this package.
Settings → Model CapabilitiesGET {baseURL}/models server-side (credential resolved host-side, no key leak) and parses:
supported_features: ["reasoning"], supported_parameters, supports_reasoning, reasoning_effort … → reasoningcontext_length, max_output_tokens … → capacitiesllm.models() (pi-ai's own knowledge) as a complementary source — the endpoint wins for yes/no, the catalog refines the level set and stands in when the endpoint says nothing.reasoningEfforts — models already configured show their own levels (custom wire spellings included) whether or not the endpoint lists signals.not configured badge, saving will add it.input is never written or removed; whatever the official UI declared stays as-is.settings.mutate with expectedRevision, deep-cloned models array, no other provider fields are touched.# published
dsh plugin --profile web add dsh-llm-capabilities
# local dev
dsh plugin --profile web add link:D:\AllCode\dsh\dsh-llm-capabilities
Requires DHS >= 0.1.1-rc.2, node >= 22.13.
Settings → Models as usual (route, baseURL, apiKeyEnv).Settings → Model Capabilities and pick the provider — detection runs automatically.Offer thinking levels per model: pick off/low/medium/high/xhigh/max; customize wire spellings via the pencil icon when needed.llm-pi-ai (providers.<route>.models). The intensity slider updates immediately; input/vision stays however the official UI set it.x-opencode-session)OpenCode Go requires third-party agents to send a stable x-opencode-session
header for prompt-cache affinity (docs).
The host half wraps globalThis.fetch and sets it on requests whose URL contains
opencode.ai/zen/go (covers ocg-c / ocg-r / ocg-a). All other requests
pass through untouched.
ses_ + 32 hex derived from the dsh
conversation id (sha256), so the same chat keeps the same OpenCode session
across restarts. Title calls use an isolated namespace; compaction rides the
conversation's namespace because it replays history (reasoning
encrypted_content is bound to the account that issued it).400 … reasoning 'encrypted_content' was not issued to this caller
(session→account affinity lost on the gateway side), the wrapper retries
once with the replayed encrypted reasoning items stripped instead of
failing the turn. Opt out with sessionHeaders.encryptedContentRetry: false.user-agent (stays deepseek-harness/... — Go requires honest
identification) and authorization.cordis.patch.yml):- insert:
- id: model-capabilities
name: dsh-llm-capabilities
config:
sessionHeaders:
enabled: false
llm-pi-ai:
providers:
my-gateway:
baseURL: https://gateway.example/v1
api: openai-completions
models:
- id: gpt-4o
input: [text, image] # vision — written by the official UI, preserved by this plugin
reasoningEfforts: # thinking — written by this plugin
off: null
low: low
medium: medium
high: high
- id: text-only-model
input: [text]
reasoningEfforts: false # explicitly no reasoning
llm.discoverModels is intentionally narrowed host-side to id/name/contextWindow/maxTokens. This plugin adds a host route that returns the raw listing:
GET /model-capabilities/raw-models?route=<route>
It reads baseURL/apiKeyEnv from your own llm-pi-ai settings, resolves the credential via ctx.credentials, fetches {baseURL}/models, and returns {ok, data} without ever echoing the secret. Only routes you already configured are reachable (browser trust fence: rejects cross-site, checks Origin/Host).
pnpm install
pnpm run typecheck
pnpm run build
pnpm run dev # watch
The web bundle is a window.__ModuleLoader__.load({id, factory}) closure — not ESM — so keep client imports to platform modules (react, @deepseek-ai/dsh-client-*) only.
| dsh-reasoning-efforts | dsh-llm-capabilities (this) | |
|---|---|---|
| reasoning auto-detect | ✅ | ✅ (ported, strict TS) |
| vision | ❌ | handled by the official UI; input preserved on save |
| host route | /thinking-levels/raw-models | /model-capabilities/raw-models + legacy compat |
Migrate when ready — both can coexist during the transition.
MIT © hank reed (bamboostrip)