每个用户 turn 先写盘,再进入可恢复的流式循环
run_once/run_once_capture 先把用户消息加入 Session 并 save,再调用 run_turn;远程流入口还先注入跨 Agent 通知、图片和本轮 system reminder,并在 turn 前后触发 observer hooks。
模型还没开口,用户输入已经落账;即使后面 API 或工具出错,恢复时也不会连问题本身都丢掉。
耐崩溃性强,但每轮和工具结果频繁保存会增加本地 I/O,需要 journal 快路径配合。
4 impl Agent {
5 /// Run a single turn with the given user message
6 pub async fn run_once(&mut self, user_message: &str) -> Result<()> {
7 self.add_message(
8 Role::User,
9 vec![ContentBlock::Text {
10 text: user_message.to_string(),
11 cache_control: None,
12 }],
13 );
14 self.session.save()?;
15 if trace_enabled() {
16 eprintln!("[trace] session_id {}", self.session.id);
17 }
18 let _ = self.run_turn(true).await?;
19 Ok(())
20 }
21
22 pub async fn run_once_capture(&mut self, user_message: &str) -> Result<String> {
23 self.add_message(
24 Role::User,
25 vec![ContentBlock::Text {
26 text: user_message.to_string(),
27 cache_control: None,
28 }],
29 );
30 self.session.save()?;
31 if trace_enabled() {
32 eprintln!("[trace] session_id {}", self.session.id);
33 }
34 self.run_turn(false).await
35 }
查看全部 2 处证据
-
实现
crates/jcode-app-core/src/agent/turn_execution.rs:4–35run_once/capture 先 append+save。 -
实现
crates/jcode-app-core/src/agent/turn_execution.rs:37–90通知、图片、reminder 与 turn hooks。