dsh-deepseek-web-login 0.6.34 → 0.6.35
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 +34 -0
- package/lib/index.js +15 -9
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,40 @@
|
|
|
2
2
|
|
|
3
3
|
本项目大致遵循语义化版本;日期为本地时间。
|
|
4
4
|
|
|
5
|
+
## 0.6.35 — 2026-10-02
|
|
6
|
+
|
|
7
|
+
**纠正 0.6.34:真正的原因是 DSH 的工具返回是 `role: "tool"`,而我们没有这个分支。**
|
|
8
|
+
|
|
9
|
+
0.6.34 我按"工具返回被折进一条普通 user 文本"去修的(判据是"assistant 发过工具调用 ⇒ 紧随的
|
|
10
|
+
user 文本就是返回")。**那个推断是猜的,而且我的证据本身是错的** —— 我用的
|
|
11
|
+
`dev/dump-turn-input.mjs` 只打了 `user/message` / `assistant/message` / `request/header` / `step/end`
|
|
12
|
+
**四种事件**,而工具返回记在第五种里:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
type=tool/result {"message":{"role":"tool",
|
|
16
|
+
"toolCallId":"call_c2cf288c12734112b11e",
|
|
17
|
+
"content":[{"type":"text","text":"2026-10-02 18:54:28 星期五\r\n"}],"isError":false}}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**`role: "tool"`** —— 不是 `role:'user'`,也不是 `tool-result` 块(测试夹具里长的是后者,真机不是)。
|
|
21
|
+
我们原来**没有 `tool` 这个分支**,于是它掉进 user 分支 ⇒ 渲染成
|
|
22
|
+
`User: 2026-10-02 18:54:28 星期五` ⇒ 模型以为"用户告诉了我时间"(它的思考原话:
|
|
23
|
+
「**我没拿到工具结果,用户直接给了时间**。那就接受。」)⇒ 回答变成「收到,…」。
|
|
24
|
+
|
|
25
|
+
**改法(这次是有证据的)**:`serializePromptParts` 增加 `role === 'tool'` 分支,
|
|
26
|
+
用消息**自带的** `toolCallId` 与 `isError` 标成 `[Tool Result for <id>]`,
|
|
27
|
+
并清掉 0.6.34 那条"预期下一个 user 文本是工具返回"的待办。
|
|
28
|
+
0.6.34 的推断**保留为次要防线**(注释已改写,明确它不是主要依据),因为两种形状的期望输出一致、
|
|
29
|
+
留着能覆盖我没能证伪的那种形状;且主分支会先清掉待办,它不会再误触发。
|
|
30
|
+
|
|
31
|
+
**顺带修掉那个把我带偏的工具**:`dev/dump-turn-input.mjs` 增加 `tool/call` / `tool/result` 分支 ——
|
|
32
|
+
**看不见工具返回的诊断,比没有诊断更危险**(它让我在错误前提上写了一版修复)。
|
|
33
|
+
|
|
34
|
+
**用例 69 项**(新增 4 条,直接用手机会话日志里的确切形状)。
|
|
35
|
+
⚠️ 写这 4 条时踩了一次**虚守卫**:第一版把 assistant 侧的调用 id 与 `toolCallId` 写成**同一个值**,
|
|
36
|
+
于是关掉主分支时次要防线给出同样结果、用例**照样全绿**(变异只红 2 条而不是 4 条)。
|
|
37
|
+
把两边的 id 改成不同值后,变异才真正红 4 条 —— 又一次"两个来源同一个值就测不出真伪"。
|
|
38
|
+
|
|
5
39
|
## 0.6.34 — 2026-10-02
|
|
6
40
|
|
|
7
41
|
**修复:工具返回被当成「用户说的话」发给模型 —— 所以它回「收到,…」而不是回答问题。**
|
package/lib/index.js
CHANGED
|
@@ -1893,16 +1893,15 @@ function serializePromptParts(options) {
|
|
|
1893
1893
|
const protocol = toolSection ? `\n\n${protocolText}${toolSection}` : "";
|
|
1894
1894
|
const lines = [];
|
|
1895
1895
|
/**
|
|
1896
|
-
*
|
|
1896
|
+
* ⚠️ **次要防线**(主路径是下面 `role === 'tool'` 那一段 —— 那才是有证据的权威形状)。
|
|
1897
1897
|
*
|
|
1898
|
-
*
|
|
1899
|
-
*
|
|
1900
|
-
*
|
|
1901
|
-
* 它自己的思考原话就是:「**我没拿到工具结果,用户直接给了时间**。那就接受。」
|
|
1902
|
-
* 回答于是从"回答几点"变成"收到,…" —— 看着就像在复述一个已知答案。
|
|
1898
|
+
* 这里兜的是另一种可能存在的形状:**工具返回被折进一条普通 `user` 文本消息**。
|
|
1899
|
+
* 判据:在 agent 循环里 assistant 发出工具调用后**必须先有工具返回**才轮得到下一条用户输入,
|
|
1900
|
+
* 所以紧跟其后的那条 user 文本只可能是工具返回。
|
|
1903
1901
|
*
|
|
1904
|
-
*
|
|
1905
|
-
*
|
|
1902
|
+
* ⚠️ 不要把它当成主要依据 —— 2026-10-02 我先用这个推断去修,后来读会话日志才发现
|
|
1903
|
+
* 真机用的是 `role:'tool'`。推断能修好只是**碰巧**(两种形状的期望输出一致)。
|
|
1904
|
+
* 主路径落地后 `pendingToolCallIds` 会被清空,这里不会再误触发。
|
|
1906
1905
|
*/
|
|
1907
1906
|
let pendingToolCallIds = [];
|
|
1908
1907
|
for (const message of options.messages ?? []) {
|
|
@@ -1921,6 +1920,13 @@ function serializePromptParts(options) {
|
|
|
1921
1920
|
else if (text.trim()) lines.push(`Assistant: ${text}`);
|
|
1922
1921
|
continue;
|
|
1923
1922
|
}
|
|
1923
|
+
if (message.role === "tool") {
|
|
1924
|
+
const body = flattenText(blocks).join("") || "(no output)";
|
|
1925
|
+
const errorMark = message.isError === true ? " [ERROR]" : "";
|
|
1926
|
+
lines.push(`[Tool Result${errorMark} for ${String(message.toolCallId ?? "")}]\n${body}`);
|
|
1927
|
+
pendingToolCallIds = [];
|
|
1928
|
+
continue;
|
|
1929
|
+
}
|
|
1924
1930
|
const toolResults = blocks.filter((block) => block?.type === "tool-result");
|
|
1925
1931
|
const text = flattenText(blocks.filter((block) => block?.type !== "tool-result")).join("");
|
|
1926
1932
|
const imageMarks = blockImageMarks(blocks, options.keptImageKeys);
|
|
@@ -10442,7 +10448,7 @@ async function checkForUpdate(current, fetchImpl) {
|
|
|
10442
10448
|
* 兜底常量与 package.json 的一致性由 `tests/check-smoke.mjs` 守着,不会漂。
|
|
10443
10449
|
*/
|
|
10444
10450
|
/** 与 package.json 保持一致的兜底版本(由测试保证不会漂)。 */
|
|
10445
|
-
const FALLBACK_VERSION = "0.6.
|
|
10451
|
+
const FALLBACK_VERSION = "0.6.35";
|
|
10446
10452
|
let cached;
|
|
10447
10453
|
/** 本插件版本(如 `0.1.26`)。 */
|
|
10448
10454
|
function pluginVersion() {
|