jasonjiang9527/dsh-plugins ↗★ 0
dsh-btw
从历史划选内容快速引用或临时分支提问,并支持新上下文分隔 适合需基于历史提问又不污染主上下文的会话,需在使用中选择引用或 btw 会话
同名包的其他仓库
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:jasonjiang9527/dsh-plugins说明文档
阅读完整 README ↗使用
- 在会话历史里划选一段内容 → 选区旁浮出操作条;
- 引用提问:输入框出现引用块(保留原草稿),编辑补充你的问题后发送;
- btw:切到一次性临时会话「🔍 btw · 」——历史完整、上下文锚定在选中消息处,输入框已预填 btw 引用块,直接提问;
- 离开 btw 会话时 → toast「已归档」,侧边栏无残留。
- 新上下文:在输入框工具行点「⧉ 新上下文」(或打
/newcontext)→ toast 确认, 此后该会话不再把之前的历史发给模型;继续正常提问即可。
flowchart TD
A[划选消息区文本] --> B[mouseup 取样]
B -->|命中| C[浮层:引用提问 / btw]
C -->|引用提问| D[setDraft 预填引用块]
C -->|btw| E["sessions.fork(atSeq = 节点 anchorSeq)"]
E --> F[临时会话改名 🔍 btw · …]
F --> G[自动切换 + 预填 btw 引用块]
G --> H[离开且非 running → archiveSession]
Provider 高级配置面板
设置 → Models 页,每个 provider 卡片下方有「高级配置(dsh-btw)」折叠面板。dsh 官方 Models 页只暴露 API key / 显示名 / Base URL / 模型列表等基础字段,其余高级参数只能手改 settings.yaml——本面板把它们全部可视化,读写走官方 RPC(settings.describe / settings.mutate 乐观锁),保存时服务端 schema + serviceable 校验兜底。
可视化字段(llm-pi-ai 命名空间,providers. 下):
| 分组 | 字段 | 说明 |
|---|---|---|
| 端点与协议 | displayName / baseURL / api | api ∈ openai-completions | openai-responses | anthropic-messages |
| 超时 | timeoutMs / streamIdleTimeoutMs / websocketConnectTimeoutMs | 毫秒 |
| 传输与缓存 | transport / cacheRetention / reasoning | transport ∈ auto|sse|websocket|websocket-cached;cacheRetention ∈ none|short|long;reasoning ∈ off…max |
| thinkingBudgets | minimal / low / medium / high | 推理 provider 的 token 预算 |
| 容量与模态兜底 | defaultContextWindow / defaultMaxTokens / defaultInput | 未声明模型的兜底值(默认 262144 / 32768 / ["text"]);defaultInput 是模型自己没声明 input 时的兜底输入类型 |
| headers | 自定义请求头 | 每行 Name: Value;凭据请走 apiKeyEnv,勿写入此处 |
| 模型配置 | modelOverrides. 全字段 | 见下节:name / contextWindow / maxTokens / input(支持的输入类型) / reasoningEfforts / compat |
| retryPolicy | mode / maxRetries / retryableCodes / backoff.* | normal(可配重试次数与错误码)或 always |
模型配置项(modelOverrides.)
「模型配置」分组按模型 id 逐行覆盖目录里的模型,一行一个模型的全部模型级字段
(= dsh-llm-pi-ai schema 的 modelFields 全集):
| 字段 | 控件 | 说明 |
|---|---|---|
name | 文本框 | 显示名 |
contextWindow | 数字框 | 该模型的上下文窗口 |
maxTokens | 数字框 | 该模型的最大输出 |
input | 多选:text / image | 该模型支持的输入类型(请求模态)。都不勾 = 不声明 = 继承目录;声明 image 是让自建视觉模型可用的关键,只声明 text 可修正网关并不提供图片的目录模型 |
reasoningEfforts | 三态选择 | 继承目录 / false(声明非推理模型,用于剥掉网关服务不了的推理)/ 自定义:文本框每行 等级: wire 拼写(等级 ∈ off/minimal/low/medium/high/xhigh/max,wire 留空 = null) |
compat | 勾选组 | supportsTemperature / forceAdaptiveThinking / allowEmptySignature / supportsStrictTools / requiresThinkingAsText / supportsCacheControlOnTools |
input 是对端点的声明而非探测:pi-ai 不会去问网关接受什么,声明了图但端点拒绝,会在回合中途由 provider 报错。
行为细节:
- 字段留空 = 继承目录/协议默认(保存时
unset,不写死值); - 只对改过的字段生成写入(打开面板时快照做 diff,不把 base 层值钉进 user 层);
modelOverrides是整字段重写,但面板读写的正是modelFields全集,因此不会丢掉手写在settings.yaml里的其它模型级配置(回归用例见scripts/check-form.mjs的 round-trip 断言);- route 上若已声明
models列表,modelOverrides与之互斥(服务端拒绝),面板会就地提示; - 配置冲突(别处同时改动)会明确提示,收起重新展开即可;
- 凭据仍走官方 API key 表单(credentials seam),本面板不碰密钥。
模型配置项(modelOverrides.)
「模型配置」分组按模型 id 逐行覆盖目录里的模型,一行一个模型的全部模型级字段
(= dsh-llm-pi-ai schema 的 modelFields 全集):
| 字段 | 控件 | 说明 |
|---|---|---|
name | 文本框 | 显示名 |
contextWindow | 数字框 | 该模型的上下文窗口 |
maxTokens | 数字框 | 该模型的最大输出 |
input | 多选:text / image | 该模型支持的输入类型(请求模态)。都不勾 = 不声明 = 继承目录;声明 image 是让自建视觉模型可用的关键,只声明 text 可修正网关并不提供图片的目录模型 |
reasoningEfforts | 三态选择 | 继承目录 / false(声明非推理模型,用于剥掉网关服务不了的推理)/ 自定义:文本框每行 等级: wire 拼写(等级 ∈ off/minimal/low/medium/high/xhigh/max,wire 留空 = null) |
compat | 勾选组 | supportsTemperature / forceAdaptiveThinking / allowEmptySignature / supportsStrictTools / requiresThinkingAsText / supportsCacheControlOnTools |
input 是对端点的声明而非探测:pi-ai 不会去问网关接受什么,声明了图但端点拒绝,会在回合中途由 provider 报错。
行为细节:
- 字段留空 = 继承目录/协议默认(保存时
unset,不写死值); - 只对改过的字段生成写入(打开面板时快照做 diff,不把 base 层值钉进 user 层);
modelOverrides是整字段重写,但面板读写的正是modelFields全集,因此不会丢掉手写在settings.yaml里的其它模型级配置(回归用例见scripts/check-form.mjs的 round-trip 断言);- route 上若已声明
models列表,modelOverrides与之互斥(服务端拒绝),面板会就地提示; - 配置冲突(别处同时改动)会明确提示,收起重新展开即可;
- 凭据仍走官方 API key 表单(credentials seam),本面板不碰密钥。