@mars-sea/dsh-commandcode-provider 0.15.1 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +110 -198
- package/README.zh-CN.md +96 -165
- package/lib/client.js +88 -73
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -68
- package/package.json +1 -1
package/README.zh-CN.md
CHANGED
|
@@ -14,72 +14,67 @@
|
|
|
14
14
|
|
|
15
15
|
> 这是一个社区集成。你需要自己的 Command Code 账号、API key 或订阅,并遵守 Command Code 的服务条款。本项目与 Command Code, Inc. 无关。
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## 快速上手
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
- **key 配置灵活**:设置页填写、环境变量或官方 CLI 登录文件均可。
|
|
28
|
-
- **模型选择器标注**:每个模型标注最低套餐、折扣/FREE 徽章、峰谷时段、图片支持与上下文长度,免费模型置顶。
|
|
29
|
-
- **自定义上下文长度**:覆盖宿主用于上下文计量与自动压缩的上下文窗口——一个全局值加按模型覆盖,可在设置页或配置中设置(issue #86),不填则跟随模型目录。
|
|
30
|
-
- **按套餐过滤**:默认隐藏超出订阅套餐的模型,可一键关闭;「模型白名单」可进一步只保留常用模型。
|
|
31
|
-
- **推理强度支持**:支持推理强度的模型可在选择器中选择档位。
|
|
32
|
-
- **图片输入**:Vision 模型支持发送图片。
|
|
33
|
-
- **套餐与配额面板**:可选的 Command Code 卡片位于侧边栏底部(Settings 正上方),显示当前服务账号的套餐与 5 小时 / 每周两个配额窗口;点击后在中间栏打开面板,包含计费周期、两个窗口的进度条与重置时间、月度额度消耗,以及已购买 / 赠送余额。面板右上角的 **×** 按钮可随时把中间栏交还给会话(不会切换当前会话)。**默认关闭**——在 **设置 → Command Code → 集成与显示** 中打开「在侧边栏显示额度卡片」即可显示,同一开关也能随时隐藏(隐藏时左侧不渲染任何内容,也不会为其后台刷新用量)。面板文案跟随 Harness 显示语言(中文 / English)。
|
|
34
|
-
- **会话费用估算**:在输入框下方的 token 计数旁及用量对话框中显示估算金额(`≈`),根据持久化历史中每次请求的模型、请求时间和上下文阶梯分别计价。切换模型或稍后查看不会重新定价之前的请求。混合供应商或缺少费率时显示已定价部分的小计(`≥`);缺少历史事实或完全无法定价时不显示金额。会话内的自动/手动 compaction(上下文压缩)会额外发一次模型请求,其用量记在 `compaction/summary` 事件上,现在同样计入 Command Code 成本(历史模型分析一并计入);其他 provider 写的摘要仍不计价。结果基于插件内的价格快照,不等同于供应商账单。同样固定为英文。
|
|
35
|
-
- **联网搜索**:dsh 的 `web_search` 工具由 Command Code Provider API(`/alpha/web-search`)承载,复用聊天同一个 key 与端点,无需单独配置搜索 key 或地址。详见[联网搜索](#联网搜索)。
|
|
19
|
+
| | |
|
|
20
|
+
|---|---|
|
|
21
|
+
| 已验证引擎 | dsh `0.2.0-rc.2`(npm `latest`)· dsh `0.2.1-rc.2`(npm `next`) |
|
|
22
|
+
| 安装 —— 网页端 | `dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@latest` |
|
|
23
|
+
| 安装 —— 终端端 | `dsh plugin --profile dsh-tui add @mars-sea/dsh-commandcode-provider@latest` |
|
|
24
|
+
| 配置文件 | `$DSH_HOME/settings.yaml` → `llm-commandcode:` |
|
|
25
|
+
| API key 环境变量 | `COMMANDCODE_API_KEY` |
|
|
26
|
+
| 用量面板 | `/commandcode` |
|
|
36
27
|
|
|
37
|
-
##
|
|
28
|
+
## 功能一览
|
|
38
29
|
|
|
39
|
-
|
|
30
|
+
- **插件包**:一条 `dsh plugin add` 命令安装 `commandcode` provider 路由,带实时模型目录。
|
|
31
|
+
- **设置页**:账户列表(密钥、网页登录、实时额度、专用模型)、模型显示、隐私开关与连接参数。
|
|
32
|
+
- **目录带标注**:模型选择器里标注套餐档位、折扣/`FREE` 徽章、峰谷时段、图片支持与上下文长度,免费模型置顶。
|
|
33
|
+
- **多账户轮换**:一个账户用量打满后自动切换到下一个;可固定优先账户,也可把模型指派给专用账户。
|
|
34
|
+
- **浏览器内登录获取 key**:一键发起官方授权流程,完成后密钥自动写入本机凭据服务。
|
|
35
|
+
- **套餐与配额面板**:可选的侧边栏卡片,显示当前服务账号的套餐、5 小时 / 每周两个配额窗口、余额与重置时间。
|
|
36
|
+
- **会话费用估算**:在输入框下方的 token 计数旁显示估算金额(`≈`),按持久化历史逐次请求计价。
|
|
37
|
+
- **模型分析**:按最近会话或日期查看词元、估算成本、响应速度与失败/重试。[统计口径](docs/模型成本与性能分析.md)。
|
|
38
|
+
- **联网搜索**:dsh 的 `web_search` 工具由 Command Code 承载(`/alpha/web-search`),复用聊天同一个 key 与端点。
|
|
39
|
+
- **零数据保留**:可选的 ZDR 路由(`x-cmd-zdr: 1`),默认关闭。
|
|
40
|
+
- **上下文与输出上限**:可全局或按模型覆盖宿主计量的上下文窗口,也可限制或省略单轮 `max_tokens`。
|
|
41
|
+
- **推理强度与图片**:支持推理强度的模型在选择器中可选档位;Vision 模型支持发送图片。
|
|
42
|
+
- **终端界面**:同一次安装即可服务 [dsh-TUI](#终端界面dsh-tui) 配置,终端里有自己的 `/settings` → Command Code 页面。
|
|
40
43
|
|
|
41
|
-
|
|
42
|
-
dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@latest
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
- **更早的 dsh 版本。** 0.1.2–0.1.7 线已不再支持:那些引擎早于 0.1.7 的设置重写、`RequestMessage` 消息封装和持久化图片卸载契约,用来桥接两代引擎的兼容代码已经删除。覆盖 0.1.7 的最后一个插件版本是 0.11.17;0.1.2–0.1.6 线的最后一个版本是 0.11.11;0.5.0 时代 Harness 线的最后一个版本是 0.9.1。三者都按精确版本安装,且都不再维护:
|
|
44
|
+
## 界面截图
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@0.11.17 # dsh 0.1.7
|
|
49
|
-
dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@0.11.11 # dsh 0.1.2–0.1.6
|
|
50
|
-
dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@0.9.1 # dsh 0.5.0 线
|
|
51
|
-
```
|
|
46
|
+
**模型选择器** —— 套餐档位、折扣/FREE、峰谷时段、Image 与上下文标注:
|
|
52
47
|
|
|
53
|
-
|
|
48
|
+
<img src="assets/screenshots/model-picker.png" alt="带套餐、折扣、图片与上下文标注的模型选择器" width="320">
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@0.11.15
|
|
57
|
-
```
|
|
50
|
+
**用量面板** —— `/commandcode` 的分账户报告:
|
|
58
51
|
|
|
59
|
-
|
|
52
|
+
<img src="assets/screenshots/usage-dashboard.png" alt="用量面板" width="520">
|
|
60
53
|
|
|
61
|
-
|
|
54
|
+
**设置页** —— 带实时额度的账户列表、模型显示、隐私开关与连接参数:
|
|
62
55
|
|
|
63
|
-
|
|
56
|
+
<img src="assets/screenshots/settings-page.png" alt="Command Code 设置页面(含账户用量卡片)" width="640">
|
|
64
57
|
|
|
65
|
-
|
|
58
|
+
## 安装
|
|
66
59
|
|
|
67
60
|
```sh
|
|
68
|
-
dsh plugin --profile web
|
|
69
|
-
dsh plugin --profile web update @mars-sea/dsh-commandcode-provider@0.9.1 # 更早的 dsh(0.5.0 线,不再维护)
|
|
61
|
+
dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@latest
|
|
70
62
|
```
|
|
71
63
|
|
|
72
|
-
|
|
64
|
+
本构建面向 **dsh `0.2.0-rc.2` 与 `0.2.1-rc.2`** —— 两个已验证引擎,都走 RC(候选发布版)通道。`0.2.0-rc.2` 至今仍是 npm `latest` 指向的版本,也就是官方默认安装会跑的那一版;`0.2.1-rc.2` 挂在 `next` 标签上。使用 `0.2.1-alpha.5` 或更早版本的配置需先升级引擎,再安装本构建。兼容性细节 —— peer(对等依赖)范围、`engines.dsh` 准入规则、按引擎配对的包版本 —— 见[引擎兼容](docs/agent-reference/engine-compatibility.md)。
|
|
73
65
|
|
|
74
|
-
|
|
75
|
-
dsh plugin --profile dsh-tui update @mars-sea/dsh-commandcode-provider@0.11.15
|
|
76
|
-
```
|
|
66
|
+
**更早的 dsh 版本**已不再支持:覆盖 dsh 0.1.7 的最后一个插件版本是 `0.11.17`,0.1.2–0.1.6 线的最后一个版本是 `0.11.11`,0.5.0 时代 Harness 线的最后一个版本是 `0.9.1` —— 三者都按精确版本安装,且都不再维护。
|
|
77
67
|
|
|
78
|
-
|
|
68
|
+
> **pnpm 11 会拦下刚发布的新版本。** 它的 `minimumReleaseAge` 默认为 1440 分钟,发布不足一天的版本会被跳过,`@latest` 解析到**上一个**版本 —— 而且是静默的,命令照样以成功退出。想装 24 小时内发布的版本,必须写精确版本号:`@mars-sea/dsh-commandcode-provider@0.11.15`。这一点对每个 profile 都成立,包括下面的终端界面。
|
|
79
69
|
|
|
80
|
-
|
|
70
|
+
**更新** —— 用与安装时相同的 tag,然后重启 Web 应用。每个 profile 各自更新 —— 终端界面有独立的插件列表:
|
|
81
71
|
|
|
82
|
-
|
|
72
|
+
```sh
|
|
73
|
+
dsh plugin --profile web update @mars-sea/dsh-commandcode-provider@latest
|
|
74
|
+
dsh plugin --profile dsh-tui update @mars-sea/dsh-commandcode-provider@latest
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 获取 API key 并验证
|
|
83
78
|
|
|
84
79
|
最简单的途径是官方 CLI(Node.js 22+):
|
|
85
80
|
|
|
@@ -92,36 +87,30 @@ cmd login # macOS/Linux;Windows 原生版:cmdc login
|
|
|
92
87
|
|
|
93
88
|
> 登录流程依赖 Host 与浏览器在同一台机器(回环回调)。Host 在远程机器上时请使用手动粘贴;若组合配置里写了字面量 `apiKey`,它仍优先于登录写入的凭据。
|
|
94
89
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
重启后,在 **设置 → Command Code** 填入 API key 并保存;**设置 → Models** 出现 **Command Code** 卡片,模型选择器在 **commandcode** 下列出实时目录。选择套餐内包含的模型发送消息即可。
|
|
90
|
+
**验证方式**:重启后,在 **设置 → Command Code** 填入 API key 并保存。**设置 → Models** 出现 **Command Code** 卡片,模型选择器在 **commandcode** 下列出实时目录。选择套餐内包含的模型发送消息即可。
|
|
98
91
|
|
|
99
92
|
## 终端界面(dsh-TUI)
|
|
100
93
|
|
|
101
|
-
|
|
94
|
+
**每个 dsh profile 有独立的插件列表**,所以上面那条 Web 安装命令不会装到终端里 —— 还要把插件装进 `dsh-tui` profile,并写死精确版本号(新版本发布后的 24 小时内,只写包名或 `@latest` 会被静默解析到上一个版本,结果就是全新的终端安装既没有 `/settings` → Command Code 页面,也看不到任何 `commandcode` 模型):
|
|
102
95
|
|
|
103
96
|
```sh
|
|
104
|
-
dsh plugin --profile dsh-tui add @mars-sea/dsh-commandcode-provider@
|
|
97
|
+
dsh plugin --profile dsh-tui add @mars-sea/dsh-commandcode-provider@latest
|
|
105
98
|
```
|
|
106
99
|
|
|
107
|
-
这里请写精确版本号。新版本发布后的 24 小时内,只写包名(或 `@latest`)会被静默解析到上一个版本 —— 安装命令照样成功,但 profile 里拿到的是旧版本,结果就是全新的终端安装里既没有 **`/settings` → Command Code** 页面,也看不到任何 `commandcode` 模型。
|
|
108
|
-
|
|
109
100
|
之后在模型选择器里选,或者直接指定:
|
|
110
101
|
|
|
111
102
|
```text
|
|
112
103
|
/model commandcode/deepseek/deepseek-v4.1-flash
|
|
113
104
|
```
|
|
114
105
|
|
|
115
|
-
`/model` 会列出所有已注册的 provider,Command Code
|
|
116
|
-
|
|
117
|
-
**填写 API key。** 终端没有网页版 Models 页面,所以插件会在终端设置页里声明自己的页面 —— **`/settings` → Command Code** —— 包含 API key、API 地址、隐藏套餐外模型、当前账号和命令语言。key 字段是只写的:它只显示"是否已配置",输入的内容写进凭据库,不会写进任何 settings 文档。只用终端的用户只需要访问这一个页面。
|
|
106
|
+
`/model` 会列出所有已注册的 provider,Command Code 的实时目录连同套餐/优惠/上下文标注一起出现;`/commandcode` 用量面板在终端里同样可用。
|
|
118
107
|
|
|
119
|
-
|
|
108
|
+
**填写 API key。** 终端没有网页版 Models 页面,所以插件会在终端设置页里声明自己的页面 —— **`/settings` → Command Code** —— 包含 API key、API 地址、隐藏套餐外模型、当前账号和命令语言。key 字段是只写的:它只显示"是否已配置",输入的内容写进凭据库,不会写进任何 settings 文档。同一页面还把整个模型目录列成勾选框,按套餐档位分组、免费模型排在最前;默认全部勾选 —— 未设置白名单就等于"显示全部模型",选择会以「单模型覆盖」的形式保存在网页端编辑的 `visibleModels` 列表旁边,两个界面可以混用。
|
|
120
109
|
|
|
121
110
|
也可以在终端外配置 key。凭据解析先命中者生效,顺序如下:
|
|
122
111
|
|
|
123
112
|
- 组合配置里写死的字面量 `apiKey` 最优先,写了就一直用它。
|
|
124
|
-
- 否则按凭据引用解析(`apiKeyEnv`,默认 `COMMANDCODE_API_KEY`)。在 **Web、桌面端、SDK、ACP 等挂载了凭据服务的 profile** 里由凭据服务统一解析:**0.2.1-alpha.3
|
|
113
|
+
- 否则按凭据引用解析(`apiKeyEnv`,默认 `COMMANDCODE_API_KEY`)。在 **Web、桌面端、SDK、ACP 等挂载了凭据服务的 profile** 里由凭据服务统一解析:**0.2.1-alpha.3 起已保存的凭据优先于启动环境变量**;更早的版本顺序相反,那时环境变量优先。
|
|
125
114
|
- **headless(无头)profile 有意不挂载凭据服务**,因此只有启动环境变量、项目 `.env`、`$DSH_HOME/.env` 生效 —— **在页面上保存过的 key 不会到达 headless 运行**,请为这类运行导出变量或写 `.env`。
|
|
126
115
|
- 最后兜底是官方 CLI 写入的 `~/.commandcode/auth.json`。
|
|
127
116
|
|
|
@@ -130,7 +119,7 @@ export COMMANDCODE_API_KEY="user_..." # 启动环境变量
|
|
|
130
119
|
cmd login # 写入 ~/.commandcode/auth.json
|
|
131
120
|
```
|
|
132
121
|
|
|
133
|
-
**把 Command Code 设为默认模型。** dsh-TUI 写死了自己的 agent 路由,它的 `agent-default-model`
|
|
122
|
+
**把 Command Code 设为默认模型。** dsh-TUI 写死了自己的 agent 路由,它的 `agent-default-model` 设置不会覆盖它。请在自己的 profile patch(`$DSH_HOME/profiles/dsh-tui/cordis.patch.yml`)里覆盖 `agent-loop` 行:
|
|
134
123
|
|
|
135
124
|
```yaml
|
|
136
125
|
- id: agent-loop
|
|
@@ -144,8 +133,6 @@ cmd login # 写入 ~/.commandcode/auth.json
|
|
|
144
133
|
cwd: !!js process.cwd()
|
|
145
134
|
```
|
|
146
135
|
|
|
147
|
-
**引擎版本要求。** 插件维护**两个已验证引擎:dsh `0.2.0-rc.2` 与 dsh `0.2.1-rc.2`**。`@deepseek-ai/dsh-*` 的 peer(对等依赖)为精确版本析取式 `0.2.0-rc.2 || 0.2.1-rc.2`;`@deepseek-ai/cordis` 与 `@deepseek-ai/schemastery` 使用按引擎配对的析取式 `~4.0.4 || ~4.0.5` 与 `~3.18.4 || ~3.18.5`——每个分支对应一代引擎的配对:`0.2.0-rc.2` 随 cordis `~4.0.4`/schemastery `~3.18.4` 发布,`0.2.1-rc.2` 随正式版 `4.0.5`/`3.18.5` 发布。兼容记录恰好包含这两个引擎——**两条都是 RC,不含 alpha 通道**,因为自 `0.2.1-alpha.5` 之后没有新的已验证版本。`0.2.0-rc.2` 虽然更旧,但被有意保留:它仍是 npm `latest` 解析到的版本,去掉它会让跑默认安装的宿主用 `engines.dsh` 准入直接拒绝本插件。每个分支仍必须是裸版本号,`0.2.0-rc.1`、`0.2.1-rc.1`、`0.3.0-alpha.1` 等未验证的邻近版本继续被拒。`npm run test:engine` 与 `npm run test:install` 对每个已声明引擎各跑一遍而不是只跑其中一个,前者还会用该引擎自己的 `evaluatePluginCompatibility` 对发布清单求值——自 alpha.4 起该判定只读 `engines.dsh`,因此引擎声明写错会在这一步失败,而不是拖到安装时才暴露。旧引擎安装说明见[安装](#安装)。
|
|
148
|
-
|
|
149
136
|
## 用量面板
|
|
150
137
|
|
|
151
138
|
插件注册了 `/commandcode` 斜杠命令,显示各账户的用量状态:
|
|
@@ -160,115 +147,80 @@ cmd login # 写入 ~/.commandcode/auth.json
|
|
|
160
147
|
|
|
161
148
|
有多个 Command Code 订阅时,插件可以在一个账户达到用量限额后**自动切换到下一个账户**:
|
|
162
149
|
|
|
163
|
-
- **配置**:在 **设置 → Command Code**
|
|
150
|
+
- **配置**:在 **设置 → Command Code** 的「账户」卡片点击「添加账户」,然后选择「网页登录」(在浏览器授权后自动保存 key;登录未完成不会留下空账户)或「粘贴密钥」。添加、重命名、更换或清除密钥、移除、固定等账户操作**立即生效**,无需点击页面底部的「保存」;「保存」只作用于页面上的其他设置。顶层 key 始终是第一顺位的 `default` 账户。
|
|
164
151
|
- **手动切换**:在账户行的「⋯」菜单中选择「固定使用此账户」即可指定优先账户;所选账户耗尽时自动回落到其他账户,窗口重置后自动恢复。「取消固定」回到自动轮换。
|
|
165
152
|
- **专用模型**:展开某个账户,从实时模型目录**多选**它的「专用模型」。请求这些模型且该账户可用时使用该账户;账户耗尽或密钥失效时自动回落到常规轮换。一个模型同一时间只属于一个账户,给另一个账户选择它会自动移过去(仍保存为 `modelAccountRules`)。
|
|
166
153
|
- **只显示常用模型**:在「模型与上下文」卡片的「可见模型」中勾选要保留的模型,模型选择器只列出这些;不勾选则显示全部(默认行为不变)。
|
|
167
|
-
- **状态展示**:每个账户行直接显示套餐、状态以及 5 小时 / 每周额度条,展开可查看完整报告;`/commandcode` 同样按账户显示状态。
|
|
168
154
|
|
|
169
|
-
|
|
155
|
+
每个账户行直接显示套餐、状态以及 5 小时 / 每周额度条,展开可查看完整报告,也可运行 `/commandcode`。等价的 YAML 见[配置](#配置)一节。
|
|
156
|
+
|
|
157
|
+
## 配置
|
|
158
|
+
|
|
159
|
+
**设置 → Command Code** 把选项分为:**账户**(密钥、网页登录、实时额度、固定账户、专用模型)、**模型与上下文**(隐藏套餐外模型、可见模型、上下文长度、输出上限)、**隐私与安全**(零数据保留)、**集成与显示**(联网搜索、侧边栏额度卡片)、**高级设置**(API 地址、超时、传输重试、图片卸载)。同一组选项也位于 `$DSH_HOME/settings.yaml`,修改即刻生效,无需重启:
|
|
170
160
|
|
|
171
161
|
```yaml
|
|
172
162
|
llm-commandcode:
|
|
173
163
|
apiKeyEnv: COMMANDCODE_API_KEY # 第一顺位(default)账户
|
|
174
|
-
activeAccount: COMMANDCODE_API_KEY_2 #
|
|
175
|
-
accounts: #
|
|
164
|
+
activeAccount: COMMANDCODE_API_KEY_2 # 可选:手动指定当前账户
|
|
165
|
+
accounts: # 可选:之后的轮换顺序
|
|
176
166
|
- label: Go #2
|
|
177
167
|
apiKeyEnv: COMMANDCODE_API_KEY_2
|
|
178
|
-
- label: Go #3
|
|
179
|
-
apiKeyEnv: COMMANDCODE_API_KEY_3
|
|
180
168
|
modelAccountRules: # 可选:按模型路由到账户(第一条命中生效)
|
|
181
169
|
- models: # 目录模型 id(可多选)
|
|
182
170
|
- deepseek/deepseek-v4-pro
|
|
183
|
-
- deepseek/deepseek-v4-flash-vision-exp
|
|
184
171
|
account: COMMANDCODE_API_KEY_2
|
|
185
|
-
|
|
186
|
-
- tencent/hy4-preview
|
|
187
|
-
account: default
|
|
188
|
-
visibleModels: # 可选:只在选择器中显示这些模型(目录模型 id),不填显示全部
|
|
172
|
+
visibleModels: # 可选:只在选择器中显示这些模型;不填显示全部
|
|
189
173
|
- deepseek/deepseek-v4-pro
|
|
190
|
-
- tencent/hy4-preview
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
## 配置
|
|
194
|
-
|
|
195
|
-
**设置 → Command Code** 分为:**账户**(密钥、网页登录、实时额度、固定账户、专用模型)、**模型与上下文**(默认折叠,点标题展开:隐藏套餐外模型、可见模型,以及紧随白名单之后的**自定义上下文长度**字段与**按模型覆盖**列表,全局与按模型,见下)、**隐私与安全**(零数据保留 ZDR,默认关闭,见下)、**集成与显示**(用 Command Code 承载联网搜索、在侧边栏显示额度卡片,默认关闭),以及默认折叠的**高级设置**(API 地址、请求/流超时、传输重试次数、历史图片缓存优化)。两个可折叠分组都点标题整行展开/收起,展开状态不跨刷新记忆。工作目录已不在页面上显示,配置中的 `workingDir` 仍然有效。
|
|
196
|
-
|
|
197
|
-
同一组选项也位于 `$DSH_HOME/settings.yaml`(修改即刻生效,无需重启):
|
|
198
|
-
|
|
199
|
-
```yaml
|
|
200
|
-
llm-commandcode:
|
|
201
|
-
apiKeyEnv: COMMANDCODE_API_KEY # 凭据引用
|
|
202
174
|
apiBase: https://api.commandcode.ai
|
|
203
|
-
workingDir: /path/to/project
|
|
175
|
+
workingDir: /path/to/project # 可选
|
|
204
176
|
modelsCachePath: ~/.commandcode/models-cache.json
|
|
205
|
-
requestTimeoutMs: 300000
|
|
206
|
-
streamIdleTimeoutMs: 300000
|
|
207
|
-
# offloadSeenImagesForCache: true
|
|
208
|
-
showSidebarQuota: true
|
|
209
|
-
zdr: true
|
|
210
|
-
# contextWindow: 131072
|
|
211
|
-
# contextWindowOverrides:
|
|
177
|
+
requestTimeoutMs: 300000 # 默认 300s(与官方 CLI 一致)
|
|
178
|
+
streamIdleTimeoutMs: 300000 # 默认 300s
|
|
179
|
+
# offloadSeenImagesForCache: true # 可选:模型回复后不再重发旧图片
|
|
180
|
+
showSidebarQuota: true # 可选:侧边栏套餐与配额卡片(默认关闭)
|
|
181
|
+
zdr: true # 可选:只经由零数据保留上游(默认关闭)
|
|
182
|
+
# contextWindow: 131072 # 可选:对所有模型的自定义上下文长度
|
|
183
|
+
# contextWindowOverrides: # 可选:按模型的上下文长度;优先于 contextWindow
|
|
212
184
|
# deepseek/deepseek-v4-pro: 65536
|
|
213
|
-
# maxOutputTokens: 65536
|
|
185
|
+
# maxOutputTokens: 65536 # 可选:单轮输出上限;0 = 不发送 max_tokens
|
|
214
186
|
```
|
|
215
187
|
|
|
216
|
-
###
|
|
217
|
-
|
|
218
|
-
宿主用于上下文计量、并据此触发自动压缩的上下文窗口,通常来自模型目录的 `context_length`。**设置 → Command Code → 模型与上下文**中、紧随可见模型白名单之后的**自定义上下文长度**输入框与**按模型覆盖**列表(或上面的两个配置项,issue #86)可以用你自己的数值替换它:`contextWindow` 是对所有没有单独条目的模型生效的全局值,`contextWindowOverrides` 按目录模型 id 单独设置、优先于全局值。不填则完全跟随目录,默认无任何变化。
|
|
219
|
-
|
|
220
|
-
- **适用场景**:目录值偏大时,会话一长就会撞上真实的模型容量、请求以 `context_length_exceeded` 失败——填入更小的真实值,宿主会在服务端拒绝之前先压缩;目录值偏小时,长会话会比实际需要更早压缩——调大以匹配模型真实容量。
|
|
221
|
-
- 模型选择器的上下文标注、`defaultMaxTokens` 默认预算与实际请求都跟随同一解析结果。调大窗口会解除旧目录窗口对输出的限制,但仍受模型独立输出上限、运行时学习上限和网关总上限约束;显式指定的输出数也受这些上限约束。会话费用的上下文分层计价仍按每次请求的实际 token 数。
|
|
222
|
-
- 取值单位为 token,范围 1 – 10 000 000,必须为整数。网页阻止保存无效输入;配置文件中的非数值、小数或越界值由配置校验拒绝,不会静默回落。只有绕过配置校验的程序化调用会丢弃无效值,按「有效按模型值 → 有效全局值 → 目录」回落。目录没有的模型保持「无上下文宣告」的既有形状。
|
|
223
|
-
- 输入框接受 `32K`、`1M` 这样的简写(二进制换算:`32K` = 32 768、`1M` = 1 048 576,131 072、262 144 这类 2 的幂窗口可直接写成 `128K`、`256K`;落盘仍是纯数字)。按模型覆盖的模型下拉只列出**模型白名单**中可见的模型(白名单为「显示全部」时即整个目录),行列表带「模型 / 上下文长度」列头。
|
|
224
|
-
|
|
225
|
-
### 单轮输出上限
|
|
226
|
-
|
|
227
|
-
插件每次请求都会带上 `max_tokens`,取值是「模型公布的输出上限、运行时学到的上限、网关总上限 131 072」三者取最小。这个字段是**被动硬限制**:到点就被平台切断,模型自己收不到「快到上限了」的信号。**设置 → Command Code → 模型与上下文**中的**单轮输出上限**(或配置项 `maxOutputTokens`)给了三个选择:
|
|
228
|
-
|
|
229
|
-
- **留空(默认)**:完全沿用上面的推导,行为与之前一致。
|
|
230
|
-
- **正整数**:与推导值取较小者。它只能**收紧**,永远不会突破模型上限或网关上限 `131072`;越界值由配置校验拒绝。输入接受 `64K` 这样的简写。
|
|
231
|
-
- **`0`**:请求中**不发送** `max_tokens` 字段,把单轮输出规模交回平台自行限制——这是「长回答写到一半被切断」的解法,因为只要字段在,无论填多大都会在某个点被切。
|
|
188
|
+
### 上下文、输出与图片调节
|
|
232
189
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
在 CLI 传输(`/alpha/generate`)上,即使此前所有请求消息逐字节一致,新图片也可能让服务端报告的缓存命中量退回第一张历史图片处。可在「高级设置」打开「已看过的图片不再重复发送」(`offloadSeenImagesForCache`):同一模型看过图片并回复后,插件通过 dsh 持久的 `image/offload` 事件把旧图替换成稳定文字占位;当前新图仍会送给模型,后续文本更容易保持缓存。**默认关闭**,因为模型如需重新查看已 offload 的图片,必须重新读取原文件或由用户再次附加。这是费用缓解方案,未修复 Command Code 服务端的多模态缓存行为。[实测证据与限制](docs/issue-64-cache-review.md)。
|
|
190
|
+
| 配置项 | 作用 |
|
|
191
|
+
|---|---|
|
|
192
|
+
| `contextWindow`、`contextWindowOverrides` | 替换模型目录里的 `context_length` —— 宿主据此计量上下文并触发压缩(issue #86)。目录值偏大时会话会撞上 `context_length_exceeded`,偏小时又会过早压缩,用它把窗口调成模型真实容量。取值必须是 1 – 10 000 000 的整数 token,接受 `32K`/`1M` 简写。 |
|
|
193
|
+
| `maxOutputTokens` | 单轮 `max_tokens` 上限。插件每次请求本来就带 `max_tokens`,取「模型公布上限、运行时学到的上限、网关上限 131 072」三者最小 —— 被动硬限制,到点平台直接切断,模型收不到任何提示。填正整数只能**收紧**;填 `0` 则**不发送**该字段,这是「长回答写到一半被切断」的解法(`0` 只对 CLI 与 OpenAI 两条传输生效,Claude 走的 Anthropic Messages 端点必填该字段)。留空表示**清除**该配置,不是写入 0。 |
|
|
194
|
+
| `offloadSeenImagesForCache` | 在 CLI 传输上,即使此前所有请求消息逐字节一致,新图片也可能让服务端报告的缓存命中量退回第一张历史图片处。开启后,同一模型看过图片并回复后,旧图会被替换成稳定文字占位,后续文本更容易保持缓存。它只能缓解费用上涨,未修复 Command Code 服务端的多模态缓存行为;模型如需重新查看已 offload 的图片,必须重新读取原文件。默认关闭。[实测证据](docs/issue-64-cache-review.md)。 |
|
|
240
195
|
|
|
241
196
|
## 联网搜索
|
|
242
197
|
|
|
243
|
-
当你的 dsh 部署加载了 web 能力(`@deepseek-ai/dsh-web` + `@deepseek-ai/dsh-tool-web`)时,模型所用的 `web_search` 工具会由本插件的 `commandcode` 搜索 provider
|
|
198
|
+
当你的 dsh 部署加载了 web 能力(`@deepseek-ai/dsh-web` + `@deepseek-ai/dsh-tool-web`)时,模型所用的 `web_search` 工具会由本插件的 `commandcode` 搜索 provider 承载 —— 它用**与聊天相同的 API key 与 base URL** 调用 Command Code Provider API 的 `/alpha/web-search` 端点,无需另外配置搜索 key、端点或模型。
|
|
244
199
|
|
|
245
|
-
**默认开启。** 插件的 **设置 → Command Code** 页里有一个「用 Command Code 承载联网搜索」开关(`webSearch
|
|
200
|
+
**默认开启。** 插件的 **设置 → Command Code** 页里有一个「用 Command Code 承载联网搜索」开关(`webSearch`),开启时插件会自动把 `commandcode` 选为当前搜索后端;关闭则把选择权交还给之前的后端(比如 modsearch 等其他搜索插件可继续工作 —— 不会被强制回退到 dsh 自带的 DeepSeek 搜索)。该开关在**下一次搜索时生效**,无需重启。
|
|
246
201
|
|
|
247
202
|
- 该 provider 仅在 web 服务存在时以 `commandcode` 注册进 `ctx.web`;没有它,本插件仍是纯聊天插件。
|
|
248
|
-
-
|
|
203
|
+
- 若官方「网页搜索」设置里已显式选择其他后端,那个显式选择优先:插件让 `commandcode` 保持已注册但未被选中,并把这一状态报出来,而不是覆盖对方。只有在没人 pin 该字段时才接管,并记住被顶掉的后端,在关闭开关或卸载插件时恢复。若想更稳妥地固定,可设置 `searchProvider: commandcode`(或 `$DSH_WEB_SEARCH_PROVIDER=commandcode`)。
|
|
249
204
|
- dsh 工具的 `numResults` 会被收敛到 Command Code 的取值范围(1–10,默认 5);结果映射为 dsh 的 `WebSearchSource` 结构(`url`/`title`/`snippet`)。
|
|
250
205
|
|
|
251
206
|
> 这里直接使用 Command Code Provider API(与官方 CLI 内置的 `web_search` 相同),因此与 DeepSeek 原生搜索后端不同。
|
|
252
207
|
|
|
253
208
|
## 零数据保留(ZDR)
|
|
254
209
|
|
|
255
|
-
Command Code
|
|
210
|
+
Command Code 可以让请求只经由「不留存提示词与回复、也不用于训练」的上游 —— 官方 CLI 的开关是 `CMD_ZDR=1`,Provider API 上则是在请求头发 `x-cmd-zdr: 1`([官方文档](https://commandcode.ai/docs/resources/zdr))。
|
|
256
211
|
|
|
257
|
-
**默认关闭。** 在「隐私与安全」卡片里打开「零数据保留(ZDR)」(`zdr`),或写进 profile
|
|
212
|
+
**默认关闭。** 在「隐私与安全」卡片里打开「零数据保留(ZDR)」(`zdr`),或写进 profile 配置。
|
|
258
213
|
|
|
259
|
-
- 开启后,**每次聊天请求**都会带上 ZDR
|
|
214
|
+
- 开启后,**每次聊天请求**都会带上 ZDR 请求头。没有可用 ZDR 上游的模型,服务端返回 `422 cmd_zdr_no_providers`;插件不会去掉请求头重试。
|
|
260
215
|
- 万一仍被拒绝(名单过期,或那一刻没有空闲的 ZDR 上游容量),错误信息会说明原因并给出关闭 ZDR 的办法,而不是抛出一个光秃秃的 HTTP 422。
|
|
261
216
|
- **ZDR 通常更贵**:容量有限,按各上游实价透传计费,且每次请求落在哪个上游可能不同。会话费用读数仍按常规目录价估算;真实单价见 Command Code Studio 的用量页。
|
|
262
|
-
- 各套餐均可使用;ZDR 请求按套餐的默认额度(而非提升额度)计量。
|
|
263
217
|
|
|
264
218
|
## 注意事项与限制
|
|
265
219
|
|
|
266
|
-
- **图片输入按模型能力限制**:仅 Vision
|
|
267
|
-
- **图片尺寸按实际请求上报**:适配器覆盖 `imageRequestTarget`(图片请求目标),把本路由真正发送的目标上报给宿主 —— 长边 1568、编码后上限 1 MiB;宿主的截图类调用方据此估算,拿到的是网关实际收到的尺寸与字节数,而不是归一化原图。
|
|
268
|
-
- 含图片的会话切换到纯文本模型会被 dsh 拒绝——请改选带 *`Image`* 标记的模型,或先移除图片。
|
|
269
|
-
- **图片很多的长会话不会中途失效**:服务端对单次请求体有大小上限(约 50 MB,官方未公开),会话累积大量截图后,原本会在此后每一次请求都失败。现在超出预算的最旧图片会被替换成一段标明附件的"图片已省略"文字,较新的图片照常发送;若请求仍被判为过大,会先以更小的图片预算重试一次,再报错。
|
|
220
|
+
- **图片输入按模型能力限制**:仅 Vision 模型接受图片,纯文本模型会直接拒绝;含图片的会话切换到纯文本模型会被 dsh 拒绝。适配器按实际发送的目标上报图片尺寸(长边 1568、编码后上限 1 MiB);服务端对单次请求体也有上限(约 50 MB,官方未公开),超出预算的最旧图片会被替换成一段标明附件的"图片已省略"文字,仍被判为过大的请求会先以更小的图片预算重试一次。
|
|
270
221
|
- **不支持 `stop` 序列**:携带它的请求会报错。
|
|
271
|
-
-
|
|
222
|
+
- **两条传输都会重放历史推理内容**,使工具调用循环保留思维链:`/provider/v1/chat/completions` 以 `reasoning_content` 回传,`/alpha/generate` 则在重建的 assistant 轮次里带上 `reasoning` 块。两种传输都只重放带配对工具结果的工具调用。
|
|
223
|
+
- **工具参数 schema 会被归一化**到服务端要求的对象根上,因此未声明对象根的工具(第三方插件手写的 schema、MCP 服务自己的 `inputSchema`、生成的根 `$ref`)不再会让整个回合以 `schema must be a JSON Schema of 'type: "object"'` 失败。
|
|
272
224
|
- 模型目录无需 key 即可浏览;对话请求需要 key。
|
|
273
225
|
|
|
274
226
|
## 权限与隐私
|
|
@@ -278,13 +230,7 @@ Command Code 可以让请求只经由「不留存提示词与回复、也不用
|
|
|
278
230
|
## 关闭 / 卸载
|
|
279
231
|
|
|
280
232
|
- **禁用**(不删除):编辑你 profile 的 `cordis.patch.yml`,注释掉(或移除)`llm-commandcode` 行,或设置 `disabled: true`,然后重启。
|
|
281
|
-
-
|
|
282
|
-
|
|
283
|
-
```sh
|
|
284
|
-
dsh plugin --profile web remove @mars-sea/dsh-commandcode-provider
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
你在 dsh 凭据库和 `~/.commandcode/auth.json` 中的 API key 不会被改动。
|
|
233
|
+
- **完全卸载**:`dsh plugin --profile web remove @mars-sea/dsh-commandcode-provider`。你在 dsh 凭据库和 `~/.commandcode/auth.json` 中的 API key 不会被改动。
|
|
288
234
|
|
|
289
235
|
## 开发
|
|
290
236
|
|
|
@@ -294,40 +240,25 @@ npm run typecheck # tsc --noEmit
|
|
|
294
240
|
npm run build # tsdown -> lib/
|
|
295
241
|
```
|
|
296
242
|
|
|
297
|
-
在 profile
|
|
243
|
+
在 profile 里试用本地构建:`dsh plugin --profile web add /path/to/dsh-commandcode-provider`。修改 `src/` 后需重新运行 `npm run build` 并重启应用。
|
|
298
244
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
245
|
+
发布包提供插件根入口、`/client` 网页入口、`/locale/*.json` 语言包及 `/package.json` 元数据。源码只保存在仓库中;未发布的 `./src/*` 不再列入导出声明。`npm run test:pack` 根据实际打包文件核对入口。
|
|
246
|
+
|
|
247
|
+
## 参考文档
|
|
302
248
|
|
|
303
|
-
|
|
249
|
+
本 README 背后的工程细节在 [`docs/agent-reference/`](docs/agent-reference/) 下:
|
|
250
|
+
|
|
251
|
+
- [适配器与线上协议](docs/agent-reference/adapter-protocol.md) —— 传输、流式、图片、工具调用、推理重放、输出预算、ZDR 请求头
|
|
252
|
+
- [账号与重试](docs/agent-reference/accounts-and-retry.md) —— 凭据解析、账户轮换、限流、联网搜索的选择规则
|
|
253
|
+
- [客户端与设置](docs/agent-reference/client-and-settings.md) —— 设置页、网页登录、终端设置、模型选择
|
|
254
|
+
- [用量与成本](docs/agent-reference/usage-and-cost.md) —— 会话费用读数、价格快照、压缩计费
|
|
255
|
+
- [引擎兼容](docs/agent-reference/engine-compatibility.md) —— 支持的 dsh 版本、peer 范围、`engines.dsh` 准入
|
|
256
|
+
- [模型目录](docs/agent-reference/model-catalog.md) —— 目录同步、套餐档位、推理档位、优惠、ZDR 例外集
|
|
304
257
|
|
|
305
258
|
## 社区与反馈
|
|
306
259
|
|
|
307
|
-
|
|
308
|
-
- <img src="https://cdn.simpleicons.org/github/111827" width="16" alt="Releases" /> [GitHub Releases](https://github.com/Mars-Sea/dsh-commandcode-provider/releases)
|
|
309
|
-
- <img src="https://cdn.simpleicons.org/npm/111827" width="16" alt="npm" /> [npm 包](https://www.npmjs.com/package/@mars-sea/dsh-commandcode-provider)
|
|
310
|
-
- <img src="https://cdn.simpleicons.org/discourse/111827" width="16" alt="Linux.do" /> [Linux.do 社区](https://linux.do/)
|
|
260
|
+
[GitHub 仓库](https://github.com/Mars-Sea/dsh-commandcode-provider) · [GitHub Releases](https://github.com/Mars-Sea/dsh-commandcode-provider/releases) · [npm 包](https://www.npmjs.com/package/@mars-sea/dsh-commandcode-provider) · [Linux.do 社区](https://linux.do/)
|
|
311
261
|
|
|
312
262
|
## 许可证
|
|
313
263
|
|
|
314
264
|
MIT —— 见 [LICENSE](./LICENSE)。部分内容移植自 [pi-commandcode-provider](https://github.com/patlux/pi-commandcode-provider)(MIT)。
|
|
315
|
-
|
|
316
|
-
## 界面截图
|
|
317
|
-
|
|
318
|
-
**模型选择器** —— 套餐档位、折扣/FREE、峰谷时段、Image 与上下文标注:
|
|
319
|
-
|
|
320
|
-
<img src="assets/screenshots/model-picker.png" alt="带套餐、折扣、图片与上下文标注的模型选择器" width="320">
|
|
321
|
-
|
|
322
|
-
**用量面板** —— `/commandcode` 的分账户报告:
|
|
323
|
-
|
|
324
|
-
<img src="assets/screenshots/usage-dashboard.png" alt="用量面板" width="520">
|
|
325
|
-
|
|
326
|
-
**设置页** —— 带实时额度的账户列表、模型显示、隐私开关与连接参数:
|
|
327
|
-
|
|
328
|
-
<img src="assets/screenshots/settings-page.png" alt="Command Code 设置页面(含账户用量卡片)" width="640">
|
|
329
|
-
|
|
330
|
-
### 发布入口
|
|
331
|
-
|
|
332
|
-
发布包提供插件根入口、`/client` 网页入口、`/locale/*.json` 语言包及 `/package.json` 元数据。
|
|
333
|
-
源码只保存在仓库中;未发布的 `./src/*` 不再列入导出声明。`npm run test:pack` 根据实际打包文件核对入口。
|