dsh-connect-doubao 0.5.0 → 0.6.1
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 +109 -0
- package/README.en.md +13 -6
- package/README.md +60 -41
- package/lib/cli-doctor.d.ts +1 -1
- package/lib/cli-doctor.js +2 -2
- package/lib/cli-probe.js +1 -1
- package/lib/client.js +58 -12
- package/lib/{doubao-quota-Bq-V97h9.js → doubao-quota-oVRIAATg.js} +99 -10
- package/lib/{doubao-status-uEa8afa1.js → doubao-status-Dm-JiTV6.js} +526 -258
- package/lib/{doubao-upstream-CJpMsaTX.d.ts → doubao-upstream-DvtS4CgR.d.ts} +68 -5
- package/lib/index.d.ts +30 -2
- package/lib/index.js +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,115 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## 0.6.1 — 2026-11-12
|
|
8
|
+
|
|
9
|
+
> 这一版把「模型清单」从一张硬编码表,改成照抄豆包客户端菜单:有什么模型、各自多少倍率、
|
|
10
|
+
> 各自支持哪几档思考强度,全部实时读出来。三处缺陷叠在一起,任何一处单修都看不出效果。
|
|
11
|
+
|
|
12
|
+
### 修复
|
|
13
|
+
|
|
14
|
+
- **清单读错了缓存目录** —— `CACHE_DB_DIRS` 只列了 `chrome_doubao-launcher_0`,该库最后
|
|
15
|
+
一次写入是 2026-09-17,插件于是永远只看到 `0/3/4/5/9` 五条,而客户端菜单早已列出十二条。
|
|
16
|
+
现在优先读 `Default/Preferences` 里的 `saman.local_storage_for_web['frontend-request-cache']`
|
|
17
|
+
(应用每次刷新菜单都会重写,是唯一还保持最新的源),IndexedDB 退为兜底,并补上
|
|
18
|
+
`chrome_doubao-chat_0`。
|
|
19
|
+
- **键名校验卡掉了新模型** —— `looksLikeModelKey` 原为 `/^[\w-]{1,24}$/`,而第三方模型键长
|
|
20
|
+
27–37(`person-kimi-k3-1-pro-highspeed-261111` 是 37 字符),于是 Kimi 高速 / GLM Flash /
|
|
21
|
+
DeepSeek V4 系列被逐条丢弃。改为按形状校验、长度上限 64。
|
|
22
|
+
- **刷新按钮其实不刷新** —— 卡片的「刷新」发的是 GET,而清 memo 的分支挂在 POST 上,于是它把
|
|
23
|
+
十分钟前的 memo 原样又画了一遍。改为 POST(带 `x-dsh-doubao-write` 头),现在点一次就真重读。
|
|
24
|
+
- **极高 / 最高 根本发不出去** —— shim 的 `toDoubaoLevel` 只认 low/mid/high,序号 6 和 7 被静默
|
|
25
|
+
夹到「高」,DeepSeek / Kimi / 2.1 Max 的上半档等于不存在。现在 6/7 直通。
|
|
26
|
+
- **档位顺序被排序打乱** —— 「自动」声明的是 低(3) / 中(8) / 高(5),按数值排序会把「高」排成
|
|
27
|
+
中间档、8 排成最强档。改为保留菜单顺序。
|
|
28
|
+
- **非标准档位被吞掉** —— `findReasoningLevel` 以前只认三个名字,序号 8 会退回「高」;现在未知
|
|
29
|
+
序号原样透传成一个临时档位,不会把用户选的那个换掉。
|
|
30
|
+
|
|
31
|
+
### 新增
|
|
32
|
+
|
|
33
|
+
- **倍率 / 优惠标签** —— 读客户端菜单的 `tag_list` 原样显示:`0.65x`、`0.46x` 这类是倍率,
|
|
34
|
+
`限时优惠 0.01x`、`小额免费` 这类是活动标签(描边样式区分,避免活动价被当成常价)。
|
|
35
|
+
卡片同时注明「倍率来自客户端菜单,本插件不参与计费,也无法核对实际扣费」。
|
|
36
|
+
- **每个模型自己的思考档位** —— 菜单的 `reasoning_effort_config.option_list` 是逐模型的,而且
|
|
37
|
+
不统一:GLM 只有 低/高/最高(3/5/7),2.1 Lite 是 低/中/高(3/4/5)。以前统一用目录里那三档,
|
|
38
|
+
等于对 GLM 承诺了一个它没开的「中」。现在按模型自己的阶梯渲染,`thinkingLevelMap` 也据此生成。
|
|
39
|
+
- **档位验证标记** —— 实测过的档位(3/4/5)实线;只在菜单里声明、还没在真实请求中验证的
|
|
40
|
+
(6 极高 / 7 最高)虚线,tooltip 里写明。
|
|
41
|
+
|
|
42
|
+
### 其它
|
|
43
|
+
|
|
44
|
+
- 新模型按 `default_mode` 归入对应模式:`mode_id: "3"` 的第三方模型走「工作任务」
|
|
45
|
+
(`agent_mode 1` / `conversation_mode 2` / `need_deep_think 10001`),不会被当成普通对话。
|
|
46
|
+
- `findDoubaoModel` 对未见过的键改为原样透传,新增 `isKnownModelId` 区分「没有显示名」与
|
|
47
|
+
「不存在」——否则新模型会被静默换成豆包快速。
|
|
48
|
+
- `toPiModel` 的 `thinkingLevelMap` 按模型阶梯生成:`xhigh` / `max` 只在模型真有这两档时给出
|
|
49
|
+
映射,否则为 `null`(pi-ai 把 `null` 读成「不提供」,而不是夹到相邻档)。
|
|
50
|
+
- 卡片里的 `requested_model` 优先显示客户端原名。
|
|
51
|
+
- 新增回归测试:长 `person-*` 键必须能解析、超长与含空格的键必须被拒、6/7 档位、未知序号透传、
|
|
52
|
+
逐模型阶梯、倍率原样保留。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 0.6.0 — 2026-11-11
|
|
57
|
+
|
|
58
|
+
> 模型清单从「只认五个老模型」修成「客户端菜单有什么就显示什么」。三处缺陷叠在一起,
|
|
59
|
+
> 任何一处单修都看不出效果。
|
|
60
|
+
|
|
61
|
+
### 修复
|
|
62
|
+
|
|
63
|
+
- **清单读错了缓存目录**:`CACHE_DB_DIRS` 只列了 `chrome_doubao-launcher_0`,该库最后一次
|
|
64
|
+
写入是 2026-09-17,插件于是永远只看到 `0/3/4/5/9` 五条,而客户端菜单早已列出十二条。
|
|
65
|
+
现在优先读 `Default/Preferences` 里的 `saman.local_storage_for_web['frontend-request-cache']`
|
|
66
|
+
(应用每次刷新菜单都会重写,是唯一还保持最新的源),IndexedDB 退为兜底,并补上
|
|
67
|
+
`chrome_doubao-chat_0`。
|
|
68
|
+
- **键名校验卡掉了新模型**:`looksLikeModelKey` 原为 `/^[\w-]{1,24}$/`,而第三方模型键长
|
|
69
|
+
27–37(`person-kimi-k3-1-pro-highspeed-261111` 37 字符),于是 Kimi 高速 / GLM Flash /
|
|
70
|
+
DeepSeek V4 系列被逐条丢弃。改为按形状校验、长度上限 64。
|
|
71
|
+
- **刷新按钮其实不刷新**:卡片的「刷新」发的是 GET,而清 memo 的分支挂在 POST 上,
|
|
72
|
+
于是它把十年前的 memo 原样又画了一遍。改为 POST(带 `x-dsh-doubao-write`),
|
|
73
|
+
现在点一次就真重读缓存。
|
|
74
|
+
|
|
75
|
+
### 其它
|
|
76
|
+
|
|
77
|
+
- 新模型按 `default_mode` 归入对应模式:`mode_id: "3"` 的第三方模型走「工作任务」
|
|
78
|
+
(`agent_mode 1` / `conversation_mode 2` / `need_deep_think 10001`),不会被当成普通对话。
|
|
79
|
+
- `findDoubaoModel` 对未见过的键改为原样透传 + `isKnownModelId` 区分「没名字」与「不存在」,
|
|
80
|
+
否则新模型会被静默换成豆包快速。
|
|
81
|
+
- 卡片里的 `requested_model` 优先显示客户端原名。
|
|
82
|
+
- 新增回归测试:长 `person-*` 键必须能解析、超长与含空格的键必须被拒。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
## 0.6.0 — 2026-11-11
|
|
86
|
+
|
|
87
|
+
> 生图这条路从「能出图」修到「在对话框里直接看到对的图」。三处都是实测出来的,不是推断。
|
|
88
|
+
|
|
89
|
+
### 修复
|
|
90
|
+
|
|
91
|
+
- **无水印**:生图回复里同时带着 `image_ori`(右下角有「豆包AI生成」)和 `image_ori_raw`
|
|
92
|
+
(原图)。原来取 `image_ori`,所以每张图都带 logo。现在优先 `image_ori_raw`,取不到才回落,
|
|
93
|
+
账号没开无水印档位时行为不变。
|
|
94
|
+
- **提示词不再被框架文本污染**:DSH 一轮请求会带 7 条 message——开发者提示、运行时快照、
|
|
95
|
+
技能目录、MCP 列表、记忆页面——真正的用户描述夹在其中。原来取「最后一条 user 消息」,
|
|
96
|
+
拿到的是 `<system-reminder>` 块,于是豆包把 `turn 1 step 1`、工具名当成画面内容画了出来
|
|
97
|
+
(用户看到的 “1turn / tup / tun” 残影)。现在按三条标准筛:长度 ≤600 字符、不以 `<` 开头、
|
|
98
|
+
不含已知框架标记。
|
|
99
|
+
- **自动补「生成图片:」前缀**:桌面客户端靠 `chat_ability.ability_param.reply_message_format`
|
|
100
|
+
改写正文,外部客户端没有这个钩子,服务端会把请求当普通对话回答。`withImagePrefix()` 补上
|
|
101
|
+
同样的改写;已有前缀不重复加,普通对话完全不受影响。
|
|
102
|
+
- **模型 id 宽松匹配**:DSH 可能带 provider 前缀(`doubao/image-gen`)或大小写不同,
|
|
103
|
+
漏判会静默回落到完整 agent 提示词——这正是提示词被污染的另一半原因。
|
|
104
|
+
|
|
105
|
+
### 其它
|
|
106
|
+
|
|
107
|
+
- 生图版本名改为读插件根目录的 `image-models.json`(缺省 Seedream 5.5)。该文件由
|
|
108
|
+
`doubao_imagemodels.py --sync` 从服务端 `get_item_conf` 生成,服务端上新版本后改数据即可,
|
|
109
|
+
不用改代码。
|
|
110
|
+
- 新增 `DSH_DOUBAO_DEBUG_PROMPT=1`:把实际发出的 prompt 与原始 messages 结构打到 stderr,
|
|
111
|
+
并追加到 `~/.dsh/doubao-prompt.log`。默认关闭。
|
|
112
|
+
- 新增测试:无水印变体选择、前缀注入(含幂等与普通对话不受影响)。
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
7
116
|
## 0.5.0 — 2026-11-07
|
|
8
117
|
|
|
9
118
|
> 取凭据的路只剩一条:**浏览器扫码登录**。上一轮加的 `authMode` 开关(客户端 / 浏览器)
|
package/README.en.md
CHANGED
|
@@ -39,12 +39,19 @@ With no session the plugin fails loudly ("还没有浏览器登录态…") rathe
|
|
|
39
39
|
|
|
40
40
|
## Features
|
|
41
41
|
|
|
42
|
-
- **
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
- **
|
|
47
|
-
`
|
|
42
|
+
- **The model list is the client's own menu, not a hardcoded table** — the plugin reads
|
|
43
|
+
`Default/Preferences` → `saman.local_storage_for_web['frontend-request-cache']`, so new
|
|
44
|
+
models, new prices and new level ladders appear without a plugin release. Measured
|
|
45
|
+
2026-11-12: 12 models (2 对话-mode, 9 「工作任务」-mode, 1 alias) plus the image alias.
|
|
46
|
+
- **Billing multipliers, verbatim** — the menu's `tag_list` is shown unchanged: `0.65x`,
|
|
47
|
+
`0.46x` etc. as plain multipliers, `限时优惠 0.01x` / `小额免费` as campaign tags (outlined
|
|
48
|
+
so a promo cannot read as the standing price). Display only: the plugin does not bill
|
|
49
|
+
and cannot verify the actual charge.
|
|
50
|
+
- **Per-model thinking ladders** — `reasoning_effort_config.option_list` is per model and
|
|
51
|
+
not uniform: GLM publishes 低/高/最高 (3/5/7), 2.1 Lite 低/中/高 (3/4/5), and Auto even puts
|
|
52
|
+
「中」 on ordinal **8**. The picker and `thinkingLevelMap` are built from that ladder, so
|
|
53
|
+
no level is offered that a model has no answer for. Solid chip = measured on a real
|
|
54
|
+
request (3/4/5); dotted = declared by the menu only (6 极高 / 7 最高).
|
|
48
55
|
- **Deep thinking on by default** — no extra switch: non-task models send
|
|
49
56
|
`need_deep_think: 3` on every turn, task models keep the captured `10001`. Set
|
|
50
57
|
`DSH_DOUBAO_DEEP_THINK=0` to turn it back off.
|
package/README.md
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
- **两组豆包模型** —— 对话模式两条(快速 / 2.1 Turbo·专家)与「工作任务」模式三条
|
|
40
40
|
(2.1 Lite `seed-lite-7b`、2.1 Pro `5`、自动 `9`)。任务模型走的是**会员付费额度**,
|
|
41
41
|
选中即自动切到任务模式的完整请求形态。
|
|
42
|
-
- **生图(Seedream 5.
|
|
42
|
+
- **生图(Seedream 5.5)** —— 模型选择器里选「豆包 生图」,回复即以 Markdown 图片返回真实生成图,可直接下载落盘。2026-11-02 实测端到端通过。
|
|
43
43
|
- **推理强度三档** —— 低 / 中 / 高,对应上游 `reasoning_effort` 实测值 **3 / 4 / 5**。
|
|
44
44
|
- **深度思考默认开启** —— 不再需要额外开关:非「工作任务」模型每轮发 `need_deep_think: 3`,任务模型沿用抓包到的真实形态 `10001`。`DSH_DOUBAO_DEEP_THINK=0` 可关掉。
|
|
45
45
|
- **只读额度面板** —— 5 小时限额、周额度、活动赠送额度三条进度条,各带**重置倒计时**;设置面板里手动刷新 + 5 分钟自动刷新。
|
|
@@ -93,58 +93,70 @@
|
|
|
93
93
|
|
|
94
94
|
## 模型目录
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
**清单不是硬编码的,是照抄豆包客户端菜单。** 客户端每次刷新菜单都会把它写进
|
|
97
|
+
`Default/Preferences` 的 `saman.local_storage_for_web['frontend-request-cache']`
|
|
98
|
+
(`_DesktopActionBarBriefListRequestCacheDataV1.data.modeSelectData`),插件读这里,
|
|
99
|
+
所以豆包上新模型、调价、改档位都会自动出现,不需要等插件发版。IndexedDB 只在 Preferences
|
|
100
|
+
尚未写入时兜底。
|
|
97
101
|
|
|
98
|
-
|
|
99
|
-
| --- | --- |
|
|
100
|
-
| 对话 | 豆包 快速(`0`)、豆包 2.1 Turbo「专家」(`3`) |
|
|
101
|
-
| 工作任务 | 自动(`9`)、2.1 Lite(`seed-lite-7b`)、2.1 Pro(`5`)、Turbo(`3`) |
|
|
102
|
-
|
|
103
|
-
**本插件提供这两组里的五条**(外加生图别名):
|
|
102
|
+
豆包把模型按**模式**分组(`default_mode`:`1` = 对话,`3` = 工作任务)。当前这台机器读到的:
|
|
104
103
|
|
|
105
|
-
|
|
|
104
|
+
| 名称 | `model_item_key` | 模式 | 倍率标签 | 思考档位 |
|
|
106
105
|
| --- | --- | --- | --- | --- |
|
|
107
|
-
| `0` |
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`
|
|
116
|
-
|
|
106
|
+
| 豆包 快速 | `0` | 对话 | — | 不可推理 |
|
|
107
|
+
| 豆包 2.1 Turbo | `3` | 对话 | — | 低 / 中 / 高 |
|
|
108
|
+
| 豆包 2.1 Pro | `5` | 工作任务 | 0.65x | 低 / 中 / 高 |
|
|
109
|
+
| 自动 | `9` | 工作任务 | 小额免费 | 低 / 中(8) / 高 |
|
|
110
|
+
| 豆包 2.1 Lite | `seed-lite-7b` | 工作任务 | 限时优惠 0.01x | 低 / 中 / 高 |
|
|
111
|
+
| DeepSeek V4 Pro | `person-deepseek-v4-pro-ga-260813` | 工作任务 | 0.46x | 低 / 中 / 高 / 极高 / 最高 |
|
|
112
|
+
| DeepSeek V4.1 Flash | `person-deepseek-v4-1-flash-261017` | 工作任务 | 限时优惠 0.01x | 低 / 中 / 高 / 极高 / 最高 |
|
|
113
|
+
| Kimi K3 | `person-kimi-k3-261111` | 工作任务 | 1.48x | 低 / 中 / 高 / 极高 / 最高 |
|
|
114
|
+
| Kimi K3.1 Pro | `person-kimi-k3-1-pro-261111` | 工作任务 | 0.95x | 低 / 中 / 高 / 极高 / 最高 |
|
|
115
|
+
| Kimi K3.1 Pro 高速 | `person-kimi-k3-1-pro-highspeed-261111` | 工作任务 | 1.44x | 低 / 中 / 高 / 极高 / 最高 |
|
|
116
|
+
| GLM 5.3 | `person-glm-5-3-261111` | 工作任务 | 0.80x | 低 / 高 / 最高 |
|
|
117
|
+
| GLM 5.3 Flash | `person-glm-5-3-flash-261111` | 工作任务 | 0.08x | 低 / 高 / 最高 |
|
|
118
|
+
| 豆包 生图(Seedream 5.5) | `image-gen` | 别名 | — | 低 / 中 / 高 |
|
|
119
|
+
|
|
120
|
+
> **倍率是客户端菜单的原始文本,只作展示。** 本插件不参与计费,也无法核对实际扣费;
|
|
121
|
+
> `限时优惠 0.01x` / `小额免费` 是活动标签,卡片上用描边样式与常价区分。
|
|
122
|
+
> 这份表会随客户端菜单变化,以上是 2026-11-12 实测结果。
|
|
123
|
+
|
|
124
|
+
**思考档位是逐模型的,不是统一三档。** 菜单的 `reasoning_effort_config.option_list` 每个模型
|
|
125
|
+
各写一份:GLM 只有 低/高/最高(3/5/7),2.1 Lite 是 低/中/高(3/4/5),「自动」甚至把「中」写在
|
|
126
|
+
序号 8 上(所以档位顺序按菜单原序保留,不能按数值排序)。插件按模型自己的阶梯渲染并生成
|
|
127
|
+
`thinkingLevelMap`;**实线 = 已在真实请求中验证(3/4/5),虚线 = 仅菜单声明(6 极高 / 7 最高)**。
|
|
128
|
+
|
|
129
|
+
**「工作任务」模型为什么能用。** 执行侧本来是豆包客户端进程内的 CUA 运行时(`tasks-mode-resource`
|
|
130
|
+
+ `sbox`),外部客户端注册不进去,每一轮必然 `710010702`。但 CUA 进程并非必需——服务端真正等的只是
|
|
131
|
+
三条 HTTP 应答:
|
|
117
132
|
|
|
118
133
|
```
|
|
119
|
-
POST /alice/office/tool_local/msg/ack
|
|
120
|
-
POST /alice/office/tool_local/upload_command_result
|
|
121
|
-
POST /alice/office/tool_local/msg/complete
|
|
134
|
+
POST /alice/office/tool_local/msg/ack # 轮询本地指令
|
|
135
|
+
POST /alice/office/tool_local/upload_command_result # 回传执行结果
|
|
136
|
+
POST /alice/office/tool_local/msg/complete # 标记该指令完成
|
|
122
137
|
```
|
|
123
138
|
|
|
124
|
-
服务端按 `${unique_key}:${device_id}:${aid}:message:${seq}`
|
|
125
|
-
`command: 6003`(`cmd_call
|
|
126
|
-
`
|
|
127
|
-
把这些走完,于是任务回合不再落到 `710010702`。**实测 2026-11-05 跑通,Lite 与 Pro
|
|
128
|
-
各一次纯文本回合。**
|
|
139
|
+
服务端按 `${unique_key}:${device_id}:${aid}:message:${seq}` 顺序下发(`seq = 0,1,2,…`):
|
|
140
|
+
`command: 6003`(`cmd_call`)需回传结果,`command: 6004`(`agent_finished`)表示本轮结束。
|
|
141
|
+
插件在流式生成期间并发跑应答器把这些走完,于是任务回合不再落到 `710010702`。**实测 2026-11-05 通过。**
|
|
129
142
|
|
|
130
143
|
> ⚠️ **`msg/ack` 必须单条查询。** `{ msg_ids: [0,1,2,3,4,5,6] }` 会整体失败并返回
|
|
131
|
-
> `{"code":710010702,"msg":"系统错误"}
|
|
132
|
-
>
|
|
144
|
+
> `{"code":710010702,"msg":"系统错误"}`——批里只要含一个服务端尚未生成的 `seq`,整批就废。
|
|
145
|
+
> 这是逆向时最容易踩的坑,`tests/` 里没有钉它(需要真实上游才能复现)。
|
|
133
146
|
|
|
134
|
-
|
|
135
|
-
并由配置里的 `reasoning_effort_config` 独立确认)。
|
|
136
|
-
|
|
137
|
-
**深度思考开关默认打开**(2026-11-07 起):非「工作任务」模型发 `need_deep_think: 3` 与
|
|
147
|
+
**深度思考开关默认打开**(2026-11-07 起):非「工作任务」模型每轮发 `need_deep_think: 3` 与
|
|
138
148
|
`ext.use_deep_think: "3"`;「工作任务」模型(2.1 Lite / Pro / 自动)沿用官方客户端抓到的真实
|
|
139
|
-
形态 `10001`。设 `DSH_DOUBAO_DEEP_THINK=0`
|
|
140
|
-
`reasoning_effort`
|
|
149
|
+
形态 `10001`。设 `DSH_DOUBAO_DEEP_THINK=0` 可恢复成不思考的普通回合。**档位始终只由
|
|
150
|
+
`reasoning_effort` 携带,与开关是两个独立的轴。**
|
|
141
151
|
|
|
142
152
|
「豆包 快速」**不参与思考**:深度思考全开、档位拉到高,它的回复仍是 `thinking: false`,流里也没有
|
|
143
153
|
`10040` 思考容器。所以它被标记为不可推理,模型选择器不再给它显示低/中/高。
|
|
144
154
|
|
|
145
|
-
>
|
|
155
|
+
> **思考过程为什么看不见**:开关打开后服务端确实在思考(响应里有 `10040` 思考容器和 `10091`
|
|
146
156
|
> 计时块),但**推理正文不下发**。2026-11-07 用官方客户端抓包对照确认:思考容器的子块只有一个
|
|
147
157
|
> `summary: "正在思考"`,正文块里只有正式答案。这是接口限制,不是插件丢内容。
|
|
158
|
+
> 插件的 `collectBlocks` 仍按 `parent_id` 把思考子块与答案分开,shim 也仍以
|
|
159
|
+
> `reasoning_content` 转发——服务端哪天真的开始下发,客户端不需要改动就能看到。
|
|
148
160
|
|
|
149
161
|
---
|
|
150
162
|
|
|
@@ -164,16 +176,23 @@ POST /alice/office/tool_local/msg/complete # 标记该指令完成
|
|
|
164
176
|
技能全表(客户端枚举原样抄录,非推测):`0` 自由对话、`2` 写作、`3` 生图、`4` 搜索、`5` 翻译、
|
|
165
177
|
`6` 阅读、`7` 网页、`8` 深度搜索、`9` 音乐、`11` 教育、`13` 代码执行、`16` 代码助手、`17` 视频、`18` PPT。
|
|
166
178
|
|
|
167
|
-
本插件目前只接了 **生图**:模型选择器里的「豆包 生图(Seedream 5.
|
|
179
|
+
本插件目前只接了 **生图**:模型选择器里的「豆包 生图(Seedream 5.5)」是 DSH 侧的能力别名
|
|
168
180
|
(`image-gen`,**不是** `model_item_key`),选中后 shim 发一条普通对话轮并带上 `input_skill: imageGen`,
|
|
169
181
|
再把返回的图片以 `` 追加到正文。
|
|
170
182
|
|
|
171
|
-
|
|
172
|
-
|
|
183
|
+
**四个实测细节**:
|
|
184
|
+
|
|
185
|
+
- **取无水印原图**:同一次生成,流里同时带 `image_ori`(右下角有「豆包AI生成」)和
|
|
186
|
+
`image_ori_raw`(原图)。插件优先取 `image_ori_raw`,取不到才回落 `image_ori`,
|
|
187
|
+
所以账号没开无水印档位时行为不变、不会报错。
|
|
188
|
+
- **自动补「生成图片:」前缀**:桌面客户端靠 `chat_ability.ability_param.reply_message_format`
|
|
189
|
+
改写正文,外部客户端没有这个钩子,服务端会把请求当普通对话回答。`withImagePrefix()`
|
|
190
|
+
补上同样的改写:已有前缀不重复加,普通对话完全不受影响。
|
|
191
|
+
- **只把用户那句话发出去**:一轮请求里除了用户描述,还夹着开发者提示、运行时快照、
|
|
192
|
+
技能目录、MCP 列表等机器块。插件按「长度 ≤600 字符、不以 `<` 开头、不含已知框架标记」
|
|
193
|
+
筛出真正的描述,否则豆包会把 `turn 1 step 1` 这类框架文本当成画面内容画进去。
|
|
173
194
|
- 图片 URL 的签名有效期极长(抓到的 `x-expires` 在 2037 年),但服务端会把 `.jpeg` 结尾的 URL
|
|
174
195
|
实际返回 **PNG 字节** —— 落盘时按内容判断格式,别信扩展名。
|
|
175
|
-
- 提示词会被服务端改写扩写(`creation_material_info.creation_prompt` 里是扩写后的版本),
|
|
176
|
-
所以产物质量与措辞由豆包决定,不是逐字照发。
|
|
177
196
|
|
|
178
197
|
验证脚本:`node scripts/verify-imagegen.mjs`(会真实消耗生图额度)。
|
|
179
198
|
|
package/lib/cli-doctor.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { O as classifyDoubaoFailure, f as DoubaoUpstreamError } from "./doubao-upstream-
|
|
1
|
+
import { O as classifyDoubaoFailure, f as DoubaoUpstreamError } from "./doubao-upstream-DvtS4CgR.js";
|
|
2
2
|
//#region src/cli-doctor.d.ts
|
|
3
3
|
type CheckStatus = 'ok' | 'fail' | 'skip';
|
|
4
4
|
interface DoctorCheck {
|
package/lib/cli-doctor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { _ as createDoubaoAdapter, a as doubaoQuotaView,
|
|
2
|
+
import { B as REQUIRED_COOKIE_NAMES, D as classifyDoubaoFailure, K as loadDoubaoCredentials, P as probeAccount, Q as listDoubaoProfiles, Y as describeProfileLocation, ft as DOUBAO_MODELS, i as formatDuration, m as DoubaoUpstreamError, mt as DOUBAO_PROVIDER_DISPLAY_NAME, n as fetchQuota, o as millisUntilReset, pt as DOUBAO_PROVIDER, r as findWindow, wt as discoverDoubaoModels } from "./doubao-quota-oVRIAATg.js";
|
|
3
|
+
import { _ as createDoubaoAdapter, a as doubaoQuotaView, f as discoverAllCachedModels, h as liveModels, r as DOUBAO_QUOTA_PATH, u as createDoubaoShim } from "./doubao-status-Dm-JiTV6.js";
|
|
4
4
|
//#region src/cli-doctor.ts
|
|
5
5
|
/**
|
|
6
6
|
* `doctor` — verify the whole stack end to end without spending inference quota.
|
package/lib/cli-probe.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Dt as
|
|
2
|
+
import { Dt as findDoubaoModel, F as streamChat, K as loadDoubaoCredentials, Ot as findReasoningLevel, P as probeAccount, ft as DOUBAO_MODELS, i as formatDuration, m as DoubaoUpstreamError, n as fetchQuota, o as millisUntilReset, r as findWindow } from "./doubao-quota-oVRIAATg.js";
|
|
3
3
|
//#region src/cli-probe.ts
|
|
4
4
|
/**
|
|
5
5
|
* Doubao smoke probe.
|
package/lib/client.js
CHANGED
|
@@ -200,6 +200,18 @@ window.__ModuleLoader__.load({
|
|
|
200
200
|
.dbq-model-name { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
|
|
201
201
|
.dbq-badge { font-size: 11px; color: #9fb2c8; background: #1e242c; border: 1px solid #2f3641;
|
|
202
202
|
border-radius: 999px; padding: 0 7px; }
|
|
203
|
+
/* The multiplier the client menu prints next to a model. Monospace-ish and
|
|
204
|
+
narrow so a column of them lines up; a campaign tag is outlined instead of
|
|
205
|
+
filled so a temporary promo cannot read as the standing price. */
|
|
206
|
+
.dbq-rate { font-size: 11px; color: #ffcf7a; background: #2a2418; border: 1px solid #4a3c22;
|
|
207
|
+
border-radius: 999px; padding: 0 7px; font-variant-numeric: tabular-nums; }
|
|
208
|
+
.dbq-rate-promo { color: #ffb4a8; background: transparent; border-style: dashed; }
|
|
209
|
+
/* The thinking ladder a model offers. A level the client declares but no real
|
|
210
|
+
request has exercised yet is dimmed and dotted, never silently dropped. */
|
|
211
|
+
.dbq-levels { display: inline-flex; gap: 4px; flex-wrap: wrap; }
|
|
212
|
+
.dbq-level { font-size: 11px; color: #8fa6bd; border: 1px solid #2f3641; border-radius: 6px;
|
|
213
|
+
padding: 0 5px; }
|
|
214
|
+
.dbq-level-unverified { color: #7b8a99; border-style: dotted; }
|
|
203
215
|
.dbq-model-desc { color: #9aa0a6; font-size: 11px; }
|
|
204
216
|
.dbq-saved { color: #7fd18a; font-size: 12px; }
|
|
205
217
|
.dbq-error { color: #ff9d99; font-size: 12px; }
|
|
@@ -301,13 +313,23 @@ window.__ModuleLoader__.load({
|
|
|
301
313
|
if (!response.ok) return void 0;
|
|
302
314
|
return await response.json();
|
|
303
315
|
}
|
|
304
|
-
/**
|
|
316
|
+
/**
|
|
317
|
+
* Read the catalog for the checklist. Never throws.
|
|
318
|
+
*
|
|
319
|
+
* POST, not GET: the host drops its discovery memo on a write request, so the
|
|
320
|
+
* list is re-read from the client's own caches instead of answered from a
|
|
321
|
+
* memo up to ten minutes old. The refresh button therefore has to POST — a GET
|
|
322
|
+
* would faithfully re-render a catalog it never re-read.
|
|
323
|
+
*/
|
|
305
324
|
async function fetchCatalog(signal) {
|
|
306
325
|
const response = await fetch(DOUBAO_CATALOG_PATH, {
|
|
307
|
-
method: "
|
|
326
|
+
method: "POST",
|
|
308
327
|
credentials: "same-origin",
|
|
309
328
|
signal,
|
|
310
|
-
headers: {
|
|
329
|
+
headers: {
|
|
330
|
+
accept: "application/json",
|
|
331
|
+
...WRITE_HEADERS
|
|
332
|
+
}
|
|
311
333
|
});
|
|
312
334
|
if (!response.ok) return void 0;
|
|
313
335
|
return await response.json();
|
|
@@ -876,6 +898,10 @@ window.__ModuleLoader__.load({
|
|
|
876
898
|
className: "dbq-note",
|
|
877
899
|
children: t("models.empty")
|
|
878
900
|
}),
|
|
901
|
+
models.some((model) => model.rate !== null) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
902
|
+
className: "dbq-note",
|
|
903
|
+
children: t("models.rateNote")
|
|
904
|
+
}),
|
|
879
905
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
880
906
|
className: "dbq-models",
|
|
881
907
|
children: models.map((model) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
@@ -885,15 +911,29 @@ window.__ModuleLoader__.load({
|
|
|
885
911
|
checked: draft?.has(model.id) ?? false,
|
|
886
912
|
disabled: !canWrite || draft === void 0,
|
|
887
913
|
onChange: () => toggle(model.id)
|
|
888
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.
|
|
914
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
889
915
|
className: "dbq-model-main",
|
|
890
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
916
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
891
917
|
className: "dbq-model-name",
|
|
892
|
-
children: [
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
918
|
+
children: [
|
|
919
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: model.name }),
|
|
920
|
+
model.badge !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
921
|
+
className: "dbq-badge",
|
|
922
|
+
children: model.badge
|
|
923
|
+
}),
|
|
924
|
+
model.rate !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
925
|
+
className: model.rate.kind === "promo" ? "dbq-rate dbq-rate-promo" : "dbq-rate",
|
|
926
|
+
children: model.rate.text
|
|
927
|
+
})
|
|
928
|
+
]
|
|
929
|
+
}), model.reasoningLevels.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
930
|
+
className: "dbq-levels",
|
|
931
|
+
children: model.reasoningLevels.map((level) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
932
|
+
className: level.verified ? "dbq-level" : "dbq-level dbq-level-unverified",
|
|
933
|
+
title: level.verified ? t("models.levelVerified") : t("models.levelUnverified"),
|
|
934
|
+
children: level.name
|
|
935
|
+
}, level.id))
|
|
936
|
+
})]
|
|
897
937
|
})]
|
|
898
938
|
}, model.id))
|
|
899
939
|
}),
|
|
@@ -1032,7 +1072,7 @@ window.__ModuleLoader__.load({
|
|
|
1032
1072
|
"account.profile": "配置目录",
|
|
1033
1073
|
"models.title": "模型",
|
|
1034
1074
|
"models.enabledCount": "已启用 {count} ↑",
|
|
1035
|
-
"models.routingNote": "
|
|
1075
|
+
"models.routingNote": "清单、倍率、思考档位都直接读自豆包客户端菜单,豆包上新或调价会自动出现,不需要等插件更新。带「工作任务」徽章的条目走任务模式与会员付费额度,插件会自动完成本地指令应答。缓存的档位是蓝图,实线=已在真实请求中验证,虚线=仅菜单声明",
|
|
1036
1076
|
"models.refresh": "刷新",
|
|
1037
1077
|
"models.refreshing": "刷新中…",
|
|
1038
1078
|
"models.save": "保存",
|
|
@@ -1050,6 +1090,9 @@ window.__ModuleLoader__.load({
|
|
|
1050
1090
|
"models.readOnly": "当前宿主未提供设置写入通道,勾选不会生效",
|
|
1051
1091
|
"models.loadFailed": "模型目录读取失败",
|
|
1052
1092
|
"models.empty": "没有可用的模型条目",
|
|
1093
|
+
"models.levelVerified": "已在真实请求中验证",
|
|
1094
|
+
"models.levelUnverified": "客户端菜单声明,尚未在真实请求中验证",
|
|
1095
|
+
"models.rateNote": "倍率来自豆包客户端菜单,仅作展示;本插件不参与计费,也无法核对实际扣费",
|
|
1053
1096
|
"tools.title": "实验性:工具调用",
|
|
1054
1097
|
"tools.toggle": "让豆包驱动本地工具(读写文件、执行命令)",
|
|
1055
1098
|
"tools.note": "豆包的接口没有函数调用通道(声明的 tools 会被静默忽略),此开关改用提示词模拟:把工具清单写进提示词,再把回复里的围栏解析回标准 tool_calls。实测约 11.5 秒/轮,复杂任务可能退化,故默认关闭。",
|
|
@@ -1099,7 +1142,7 @@ window.__ModuleLoader__.load({
|
|
|
1099
1142
|
"account.profile": "Profile path",
|
|
1100
1143
|
"models.title": "Models",
|
|
1101
1144
|
"models.enabledCount": "{count} enabled ↑",
|
|
1102
|
-
"models.routingNote": "The list
|
|
1145
|
+
"models.routingNote": "The list, the multipliers and the thinking levels all come from the Doubao client menu, so new models or prices appear without a plugin update. Entries badged 「工作任务」 run in task mode against the paid membership quota; the plugin answers the local workspace commands for you. Solid chip = verified on a real request, dotted = declared by the menu only",
|
|
1103
1146
|
"models.refresh": "Refresh",
|
|
1104
1147
|
"models.refreshing": "Refreshing…",
|
|
1105
1148
|
"models.save": "Save",
|
|
@@ -1117,6 +1160,9 @@ window.__ModuleLoader__.load({
|
|
|
1117
1160
|
"models.readOnly": "This host provides no settings write path; ticking has no effect",
|
|
1118
1161
|
"models.loadFailed": "Could not read the model catalog",
|
|
1119
1162
|
"models.empty": "No model entries available",
|
|
1163
|
+
"models.levelVerified": "Verified on a real request",
|
|
1164
|
+
"models.levelUnverified": "Declared by the client menu, not yet verified on a request",
|
|
1165
|
+
"models.rateNote": "Multipliers come from the Doubao client menu and are display-only; this plugin does not bill and cannot verify the actual charge",
|
|
1120
1166
|
"tools.title": "Experimental: tool calling",
|
|
1121
1167
|
"tools.toggle": "Let Doubao drive local tools (read/write files, run commands)",
|
|
1122
1168
|
"tools.note": "Doubao's endpoint has no function-calling channel — a declared `tools` array is silently ignored — so this switch simulates it: the tool list goes into the prompt and the fenced block in the reply is parsed back into standard tool_calls. Measured ~11.5s per round; can degrade on complex tasks, hence off by default.",
|