Aster文档
搜索 Aster 文档
ESC
产品
版本

输入关键词开始搜索。

    文档目录

    ASTER CODE / 功能参考

    运行控制、提问与取消

    Run 回执、并发控制、确认队列和用户回答的区别。

    会话和 Run 分别保存什么

    Agent 持有模型与共享服务;Session 绑定工作区和会话状态;一次 send 或 stream 准入一个 Run,Run 内可以有多个模型与工具轮次。聊天消息、工具事件和长期目标不是同一种记录。

    同一个 Session 的会话写入采用单次执行边界,重叠请求会返回忙状态。界面应串行提交普通对话;如果是用户对当前任务的补充,使用 steer,不要另开一个相互竞争的 send。

    架构图运行控制的请求与回执Accepted 只是排队,Applied 才表示执行消费了输入;Run 先结束时还要结算未应用请求。
    补充要求如何进入正在运行的任务接纳请求与应用请求分开。请求始终指向原 Run。12345提交 steer 或 interrupt返回接纳回执到达安全点应用匹配请求报告处理结果宿主控制收件箱当前 Run宿主控制收件箱当前 Run
    1. 01指向准确的一次运行

      请求携带 Run ID、请求 ID 和可选版本条件。

      run_control.rs L56 ↗
    2. 02接纳后等待安全点

      Accepted 表示进入收件箱。Applied 表示已作用于目标运行。

    3. 03中断仍需收尾

      interrupt 停止新增工作,并保留取消与资源收尾。

      run_control.rs L56 ↗

    下载 SVG ↗

    给当前任务追加约束

    先读取当前 Run 状态,把输入绑定到用户看到的 Run 和 Turn 版本。下面接收一个正在运行的会话;它不是创建第二个任务的入口。

    use aster_core::{AgentSession, SteerRequest};
    
    async fn append_instruction(session: &AgentSession) -> anyhow::Result<()> {
        let current = session.run_control_snapshot().await
            .ok_or_else(|| anyhow::anyhow!("当前没有运行中的任务"))?;
        let mut request = SteerRequest::new("请先完成只读检查,再考虑修改文件")
            .with_run_id(current.run_id);
        if let Some(turn_id) = current.turn_id {
            request = request.with_expected_turn(turn_id, current.turn_revision);
        }
        let receipt = session.steer(request).await?;
        println!("{} {:?}", receipt.request_id, receipt.state);
        Ok(())
    }
    

    控件重试时复用 request_id;新意图使用新 ID。预期 Turn 已变化时,刷新状态并让用户决定是否重新提交。不能去掉版本条件后偷偷重试。

    回执状态界面可以怎么说
    Accepted已排队,等待安全点
    Applied当前执行已消费这条控制请求
    Rejected没有进入收件箱,显示 error 中的原因
    SettledRun 已结束,这条请求未按原计划应用

    Accepted 不代表模型已看到输入。Applied 也不代表工具效果已结算。空闲时追加输入会拒绝,不会替用户隐式启动任务。

    公开入口是 AgentSession::steer L6 ↗,身份与预期版本字段见 RunControlRequest L80 ↗。这两处分别回答“怎样调用”和“回执绑定了什么”。

    中断与取消

    interrupt(InterruptRequest::new()) 提交可追踪的中断请求;cancel_run(run_id) 定位一个 Run,cancel() 面向当前会话执行。它们先请求停止,后续还要等待终态与清理。true 只说明请求被接收,不能据此立即更换工作区或启动同一外部写操作。

    关闭应用时先停止接收新输入,取消当前执行,消费终态,再关闭 Session 和 Agent。需要替换会话时按 cancel_and_settle 的结果判断是否可替换。返回 false 说明仍未确认原执行结算,不应发布新会话来覆盖它。

    指定 Run 的取消入口见 AgentSession::cancel_run L41 ↗,不要把接收请求的布尔值当作资源已经释放。

    确认队列不是一个布尔开关

    pending_confirmations() 返回每项请求的 tool_id、工具名、参数和剩余时间。界面以 tool_id 保存选择状态;批准使用 confirm_tool_use,过期或已处理的请求不能套用到下一项。

    同时有多项确认时,每项独立显示参数和原因。事件广播丢包后重新读取 pending 列表;控件只从当前列表选择。取消会话或界面关闭时调用 cancel_confirmations(),不能让无人可见的确认继续等待。完整接线见权限章节。

    确认目录与提交入口分别是 pending_confirmations L275 ↗ 和 confirm_tool_use L287 ↗。

    用户回答不能变成权限批准

    ask_user 提出业务问题,ask_user_form 收集结构化回答。Core 的 ask_user::answer(question_id, text) 记录回答,随后由执行日志结算;它的返回值不是“问题已完成”的证明。不要将这个返回值用作界面成功状态。

    问题按 question_id 匹配;当前实现每 Run 最多三个问题、每题最多八个选项。取消不应捏造用户回答。业务回答、工具批准和运行追加指令分别处理:选择“导出 CSV”不意味着允许任意文件写入。

    建议的检查场景

    让任务停在一个确认点,同时提交一次 steer、一次过期 Turn 的 steer,再请求取消。确认旧输入未应用到新 Run、每个请求都有明确结果、待确认列表清空、资源清理完成后才能再次提交。

    实现依据