dsh-llm-gateway-compat
OpenAI-compatible gateway adapter and dialect fixes for DeepSeek Harness
snowshadow
@snowshadow
⬇ 2
★ 0
main
安装
dsh plugin --profile web add github:snowshadow/dsh-llm-gateway-compat
需要可复现安装时,可在仓库后追加 #commit 固定提交。
OpenAI-compatible gateway adapter and dialect fixes for DeepSeek Harness
该插件未提供要点说明,请参考仓库 README。
deepseek-harnessdsh-pluginllm
- 安装并启动 DeepSeek Harness:
npx @deepseek-ai/dsh web - 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
- 用 dsh plugins list 确认已安装,必要时重启 Harness 生效
插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。
| 代码仓库 | github.com/snowshadow/dsh-llm-gateway-compat |
| 许可证 | MIT |
| 主要语言 | main |
| 下载量 | 2 |
| GitHub 星标 | 0 |
| 最近推送 | 2026-08-21 |
| 收录日期 | 2026-09-19 |
| 分类 | 模型与提供方 |
事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。
以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。
# dsh-llm-gateway-compat
English | [中文](README.zh.md)
A community bundle compatible with DeepSeek Harness (DSH). It stops empty streamed tool-call identity from wiping the call, turns the two most common request 400s into an `llm-pi-ai` compat write plus one retry, and can own Chat Completions routes that default to `system` / `max_tokens`.
This is **not** an official DeepSeek package. It is not endorsed by DeepSeek.
## What it does
### Streamed tool-call identity (v0.1)
Wraps `llm/stream` so later SSE fragments with empty `id` / `name` cannot overwrite a nonempty value. Synthesizes `compat_call_` when no id ever arrives. Official DeepSeek streams stay unchanged when identity is already stable.
### Request dialect 400s (v0.2)
On `agent/request-error`, classifies `developer`-role and `max_completion_tokens` refusals, writes the matching field into official `llm-pi-ai` settings, retries the same step once, and injects a logged plugin notice. Generic 400s are not retried.
### Chat Completions adapter (v0.3)
Optional routes under `llm-gateway-compat.providers`. Each route is a direct `POST {baseURL}/chat/completions` adapter with gateway-safe defaults:
- system prompt is always `role: system`
- output cap is always `max_tokens`
- empty tool-call id/name never overwrite, even if stream sanitizing is off
- `extraBody` for fields the harness vocabulary does not own (`user`, `prompt_cache_key`)
- extra headers, `Authorization: Bearer` or DashScope `api-key`
- thinking dialect: `reasoning_content` (default), `thinking`, `think-tags`, or `none`
Route ids must not collide with `llm-deepseek` or `llm-pi-ai`. Pick a new id such as `dashscope-compat`.
## Install
From npm (recommended — ships built `lib/`, no install-time build):
```sh
dsh plugin --profile web add dsh-llm-gateway-compat
```
Restart `dsh web`.
From GitHub, pnpm fetches sources and runs `prepare`. pnpm ≥10 refuses that script until the profile allowlists it:
```sh
dsh plugin --profile web add github:snowshadow/dsh-llm-gateway-compat
```
If the first add fails, put this in that profile's `pnpm-workspace.yaml` and re-run `add`:
```yaml
allowBuilds:
dsh-llm-gateway-compat: true
```
Pin a commit (`github:snowshadow/dsh-llm-gateway-compat#`) so a later push cannot change what runs. Only allow packages whose source you trust.
## Config
Plugin switches (also live under `$DSH_HOME/settings.yaml` as `llm-gateway-compat:`):
| key | default | meaning |
|---|---|---|
| `enabled` | `true` | master switch for stream wrapping and 400 recovery |
| `diagnose` | `true` | classify known gateway 400s and inject a YAML snippet |
| `autoApplyCompat` | `true` | persist the matching `llm-pi-ai` compat field and retry once |
| `providers` | `{}` | Chat Completions routes this plugin owns |
One gateway route:
```yaml
# $DSH_HOME/settings.yaml
llm-gateway-compat:
providers:
dashscope-compat:
displayName: DashScope
baseURL: https://dashscope.aliyuncs.com/compatible-mode/v1
apiKeyEnv: DASHSCOPE_API_KEY
authHeader: bearer
thinkingFormat: reasoning_content
extraBody:
user: harness
models:
- id: deepseek-v4-flash
name: DeepSeek V4 Flash
```
Export `DASHSCOPE_API_KEY` in the environment that launches `dsh`. Include `/v1` (or `/compatible-mode/v1`) in `baseURL` when the gateway requires it. Then select the `dashscope-compat` / `deepseek-v4-flash` route in the model picker.
Provider fields:
| key | default | meaning |
|---|---|---|
| `baseURL` | required | origin plus path prefix; `/chat/completions` is appended |
| `apiKeyEnv` | required | environment variable holding the raw key |
| `authHeader` | `bearer` | `bearer` or `api-key` |
| `models` | `[]` | advisory catalog; unlisted ids still resolve as text-only |
| `extraBody` | — | merged under harness-owned fields; `max_completion_tokens` is stripped |
| `headers` | — | extra request headers; `User-Agent` still comes from harness attribution |
| `thinkingFormat` | `reasoning_content` | history + stream reasoning dialect |
| `includeUsage` | `true` | send `stream_options.include_usage` |
## Develop
```sh
pnpm install
pnpm test
pnpm run build
```
## Known limitations
- Cannot recover a tool name the gateway never emitted.
- Image input is refused (`UNSUPPORTED_CONTENT`).
- `think-tags` is applied on replayed assistant history, not on partial streamed tags.
- No idle-stream watchdog; caller `AbortSignal` is honored.
- Auto-apply only writes `supportsDeveloperRole: false` and `maxTokensField: max_tokens` on `llm-pi-ai` routes.
- There is no Web settings card; edit `settings.yaml` or the profile patch.
## License
MIT
数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。