Java daemon 结果、取消与容量
处理正式终止事件、未知结果和有界资源,避免误重试执行。
This page has not been translated into English yet. The original Chinese version is shown below.
Java daemon SDK 将“服务端接纳了请求”和“观察到可靠结束”分开。应用不应把 HTTP 成功、收到文本、发送了 cancel 或 future 已取消当作正式任务终态。
PromptObserver 与结果
需要按序处理文本、思考、工具、用量、权限或原始事件时,用 startPrompt 和 PromptObserver。acceptanceFuture() 表示 admission,completionFuture() 表示可靠终止;取消这些 future 视图不会取消 daemon prompt。
只有匹配的 turn_complete 或 turn_error 是正式终态。prompt_cancelled 和队列事件只是提示;在取消、期限、teardown 与 agent settle 竞争时,daemon 只发布最先取得终态锁的一项,后来候选被抑制。必须按实际收到的终态分支,不能按最后发送的控制请求推断结果。
respondToPermission() 在请求已解决或不再 pending 时返回 false。不要把它解释成新权限决定被接受。
取消与观察期限
cancelActivePrompt() 发会话级 daemon cancel,之后仍需等待目标轮的正式终态。协作取消可能是 turn_complete/cancelled;取消期间 agent/provider 失败也可能产生 turn_error,使 promptText 抛 PromptTurnException。
捆绑 ACP 的取消握手等待目标 prompt 真正 settle 后才放行 FIFO 下一项,没有“等够时间就确认取消”的后门。忽略 AbortSignal 的工具或 provider 可让 cancel 永远结果未知,不能此时复用同一会话继续发工作。
PromptRequest.Builder.deadline(Duration) 要求服务端公布 prompt_absolute_deadline,范围 1–2147483647 毫秒;不支持时在发送前失败。observationTimeout(Duration) 仅限制本地 SSE 观察,超时不发送 cancel。
结果未知后的会话
PromptAdmissionUnknownException 或 PromptOutcomeIndeterminateException 之后,该 DaemonSessionClient 永久拒绝新 prompt,即使后台流清理后来成功。应关闭或销毁会话,而不是通过“清理完成了”推断上一任务已停止。
观察超时不无限等阻塞的 stream close;清理异步继续并占用有界容量。只有在调用方观察窗口内收到正式终态,才可据它判断完成。恢复卡死的共享 ACP 而完全不影响兄弟会话,需要更强运行时隔离,不在 alpha 保证内。
自动重连与不自动重试
SSE 使用 Accept-Encoding: identity、Last-Event-ID,验证事件 framing/ID、去重回放,并只自动重连 SSE GET。prompt 和其他 mutation 不自动重试。
prompt admission、session create、permission、cancel、heartbeat、detach、delete 返回 408 或 5xx 时,都可能是 outcome-unknown,因为状态码不证明 mutation 没有生效。有限响应体与 SSE 观察有独立期限。
已知 sessionId 可以在创建前传 RFC UUID v1–v5,需 session_id_override。返回 ID 不一致会抛 SessionCreationOutcomeUnknownException。它始终新建线程,不是幂等 attach;结果不明时按已知 ID 恢复,而不是再创建。若没有预先 ID 且响应丢失,可能留下 caller 不知道的会话,SDK 无法定向 detach,由 daemon 生命周期清理接管。
心跳与有界容量
支持 client_heartbeat 时,打开的 session 默认每分钟发送新心跳。builder 的 heartbeatInterval(Duration.ZERO) 关闭,正时长可调整;失败的心跳不重试,下次定时是另一条新 keepalive。
每 client 默认同时观察最多 32 个 prompt,可用 maximumConcurrentPrompts 调整。future callback 不运行在传输 worker 上,但阻塞 callback 占有界发布容量;阻塞的 SSE close 也持有清理 reservation。容量不足时后续 startPrompt 可抛 DaemonClientCapacityException,不无限创建线程或丢弃清理任务。
alpha 不保证跨 daemon 重启恰好执行一次、自动 epoch 恢复、snapshot/resync、持久 cursor 或真正按 prompt ID 定向取消。应用应保留业务状态与恢复证据,不能把这些缺口交给传输重试掩盖。