Skip to content
FunCoding

Search

Search docs, Skills and MCP

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 定向取消。应用应保留业务状态与恢复证据,不能把这些缺口交给传输重试掩盖。