Java legacy stdio
维护旧 CLI 子进程集成,配置内容回调、超时层级和资源清理。
com.alibaba.qwen.code.cli 是保留的 experimental stdio API,依赖外部 qwen-code 0.5.0+。新包的 Java 11 要求仍适用,不能将它与 daemon API 的 HTTP/SSE 生命周期混用。
调用和配置
QwenCodeCli.simpleQuery() 提供简化查询,复杂用途可通过 QwenCodeCli.newSession() 创建 Session,并配置 TransportOptions。
| 字段/方法 | 用途 |
|---|---|
| pathToQwenExecutable、cwd | CLI 路径和子进程工作目录 |
| model、authType、env | 模型、认证模式与进程环境 |
| permissionMode | default、plan、auto-edit、yolo 等该文档列出的 legacy 模式 |
| maxSessionTurns | 会话轮次限制 |
| coreTools、excludeTools、allowedTools | 工具可用集合、拒绝与预先批准 |
| includePartialMessages | 接收生成中的消息 |
| turnTimeout、messageTimeout | 一轮和单条消息的等待限制 |
| resumeSessionId | 续接旧会话 |
| otherOptions | 其他传给 CLI 的参数 |
allowedTools 表示自动批准,不是仅允许这些工具注册;default 下写调用需获批,plan 阻止写,auto-edit 自动批准编辑工具。不要为修复某个工具未执行而直接把所有操作改成 yolo。
两层事件处理
SessionEventConsumers 按 system、result、assistant、partial assistant、user、control 等消息分类;AssistantContentConsumers 在消息内部处理 text、thinking、tool use、tool result、usage 和其他内容。
onAssistantMessage 会派生内容回调,onPartialAssistantMessage 派生流式内容,onControlRequest 再路由到 onPermissionRequest 或 onOtherControlRequest。应用选择合适层级消费,避免把两层相同内容重复显示。
SessionEventSimpleConsumers 默认超时 180 秒,AssistantContentSimpleConsumers 默认 60 秒。各 handler 有对应 Timeout 方法;外层 onAssistantMessageTimeout 应长于文本、思考和工具等内层回调,onControlRequestTimeout 应长于权限及其他控制回调。
Session 生命周期
Session 可发送 prompt、interrupt 当前 prompt、setModel、setPermissionMode;TransportOptions.setResumeSessionId() 用于恢复。结束时始终调用 session.close() 清理 CLI 进程。
SessionControlException 表示会话控制问题,构造或 start 可直接抛出;QwenCodeCli.newSession() 会把更底层创建/初始化错误包成 RuntimeException。SessionSendPromptException 对应发送或响应问题。不要套用 daemon 的 PromptOutcomeIndeterminateException 去解释 stdio 特有错误。
默认线程池
旧实现的默认池核心 30、最大 100 线程,空闲保留 60 秒,LinkedBlockingQueue 容量 300,拒绝策略 CallerRunsPolicy,线程名 qwen_code_cli-pool-{number}。
线程为 daemon threads,JVM 退出时仍运行或排队的任务会被放弃。应用要求完成时需明确等待任务,不能只依靠存在异步 callback 就让 main 返回。
这些数值属于 legacy 全局池,推荐 daemon API 使用自己的有界 HTTP、prompt、maintenance 和 timer 资源,不继承这组容量参数。