Replies: 1 comment
|
这个缺口已经做成了插件形态的方案(社区侧,不需要上游改动):
- insert:
- id: steer-preempt
name: '@argszero/cordis-plugin-steer-preempt'挂上即可,无需配置。它包 实现时有一条契约事实值得记在这里,因为它决定了这件事只能怎么做:
需要说明的是这仍是社区侧止血:真正意义上的「有输出即唤醒」属于 |
|
这个缺口已经做成了插件形态的方案(社区侧,不需要上游改动):
- insert:
- id: steer-preempt
name: '@argszero/cordis-plugin-steer-preempt'挂上即可,无需配置。它包 实现时有一条契约事实值得记在这里,因为它决定了这件事只能怎么做:
需要说明的是这仍是社区侧止血:真正意义上的「有输出即唤醒」属于 |
Uh oh!
There was an error while loading. Please reload this page.
在 0.1.5-rc.2(master
c291e7961a)上确认:job_output的wait: true只在任务结束或超时到期时返回,不认「有新输出」。对一个持续产出的后台任务,等待开始后不到一秒就有了新行,工具也要睡满超时才返回。先说清楚这不算违背文档:
wait的参数描述原文就是 "Block until the job reaches a terminal status or the timeout expires."。问题在于这个契约对流式任务不合适,而 30 秒的默认值、600 秒的上限、以及系统提示词里 "set wait: true only when you are genuinely blocked on it" 的邀请,让模型读进度时一次次白白占住回合。实测
0.1.5-alpha.1 源码构建(其
packages/jobs/*/src与 rc.2 逐字节相同),隔离的DSH_HOME。计时取自会话日志里tool/call与tool/result事件的宿主时间戳。后台每秒打印一行带毫秒戳的 tick,随后
job_output {wait: true, timeout_ms: 6000}:后台
sleep 45,job_output {wait: true}不传timeout_ms:阻塞 30.01 秒,返回(no new output)+[status: running]。输出在 0.44 秒时就已可读,wait 却睡满 6 秒;无 wait 读取随时能拿到增量;任务结束本来就会自动推送完成通知。对「看进度」和「等结束」这两种最常见的意图,阻塞式 wait 什么都没多给。
代码路径(行号为 0.1.5-rc.2)
packages/jobs/jobs-local/src/index.ts:230-279的wait只有两个唤醒源:settle()释放waitResolvers(:424-426),以及deadline()定时器(:250,超时走:263-265的resolve())。没有「有新输出」的路径。packages/jobs/tool-jobs/src/index.ts:48-49的默认值是 30s / 600s,:332-333用Math.min(args.timeout_ms ?? waitDefault, waitCap)截断。全仓没有任何挂载覆盖这两个值。工具描述只写 "waits up to the configured cap"(:303-305),不给数字;工具刻意不声明timeoutMs(:306-307),所以 tool-call-timeout 策略也兜不住。叠加因素:执行期没有中间事件,UI 整个等待期只有一张挂起卡片;
busyEnter默认queue(packages/client/ui-conversation/src/submission-settings.ts:18),等待期间发的消息只会排队。git diff dsh-v0.1.5-alpha.1 c291e7961a -- packages/jobs/只动了 README 与package.json,src 未变。与相邻讨论的关系
我们前两天报的 #6030(steer 无法抢占阻塞中的 wait)是同一个函数缺了另一个出口:那边缺「有排队输入就醒」,这边缺「有新输出就醒」。#1542(job 挂死时 wait 超时只回
[status: running]、没有活性信号)相关但不同,那是分不清慢和卡死,这是明明有输出却不返回。想讨论的修法
P1a(只改
tool-jobs,约 40 行):wait: true时让ctx.jobs.wait与一个 100–250ms 的轮询赛跑,轮询调用ctx.jobs.read累积增量,非空即返回。对 final-output 任务安全,因为没有readOutput时运行中的read()返回空串(jobs-local:208-210)。P1b(正规做法):registry 加非消费的
peek与生产方的「输出已追加」通知,wait增加until: 'settle' | 'output' | 'either'。P2(零代码):挂载行加
waitTimeoutMs: 5000、maxWaitTimeoutMs: 60000,单次最坏静默从 10 分钟降到 1 分钟。另外三条成本递增:描述里写出真实上限并说明完成会自动通知(P3);为长工具调用加
tool/progress一类的进度事件(P4);工具阻塞期间把busyEnter默认改为steer(P5)。验收可以这么定:追加输出但未结束时,等待中的读取在 250ms 内带新文本返回,任务仍 running 且未标 reported;静默任务照旧按超时返回;中止仍以
wait aborted拒绝且 resolver 计数归零;现有jobs.spec.ts:450-500与tool-jobs.spec.ts:164-199原样通过。想问维护者:P1a 和 P1b 你们倾向哪个?如果走 P1b,
until能不能同时覆盖 input-pending,把 #6030 一起收掉——两个缺陷改的是同一处。All reactions