找回密码
 立即注册
搜索
查看: 115|回复: 5

:fire: SolonCode 的两个"后悔药":重新运行 vs 继续运行

[复制链接]

主题

0

回帖

0

积分

积分
0
发表于 2026-8-26 20:00:22 | 显示全部楼层 |阅读模式
在 SolonCode Web 聊天界面底部,工具栏有三个按钮(从左到右):

1. Cop — 复制上一条回复内容
2. Re-run(重新运行) — 删除旧回答,重新跑一轮
3. Continue(继续运行) — 保留旧回答,继续追加内容


这两个按钮看起来很像,但行为完全不同。今天深入拆解它们的实现。



重新运行(Re-run)

行为: 删除旧的气泡,用同样的输入重新跑一遍。

使用场景: - AI 答错了,想让它重新回答 - 想换个角度重新问

实现原理:

源码在 RerunCommand.java:

  1. [i]// 逆向遍历消息列表,找到最后一个 UserMessage[/i]
  2. List<ChatMessage> messageList = session.getMessages();
  3. String lastUserInput = null;

  4. while (!messageList.isEmpty()) {
  5.     ChatMessage msg = messageList.get(messageList.size() - 1);
  6.     if (msg instanceof UserMessage) {
  7.         lastUserInput = msg.getContent();
  8.         session.removeLatestMessage(1);
  9.         break;
  10.     }
  11.     session.removeLatestMessage(1);
  12. }

  13. [i]// 重新运行,输入相同[/i]
  14. if (lastUserInput != null) {
  15.     ctx.runAgentTask(lastUserInput, null);
  16. }
复制代码

核心逻辑: 逆向遍历找到最后一个用户消息,删除它之后的所有 AI 响应,然后用同样的输入重新跑一遍。

结果: 新回答完全替换旧回答。
继续运行(Continue)

行为: 保留旧的气泡,在旧回答后面继续追加新内容。

使用场景: - AI 答到一半断了(比如 token 限制) - 想让 AI 继续写下去 - 旧回答不完整,想让它补充

实现原理:

源码在 ContinueCommand.java:

  1. ReActTrace trace = session.getContext().getAs("__main");
  2. if (trace != null) {
  3.     if (Agent.ID_END.equals(trace.getRoute())) {
  4.         [i]// 说明有结束节点,重新回到思考点[/i]
  5.         trace.setRoute(ReActAgent.ID_REASON);
  6.         trace.setFinalAnswer(null, false);

  7.         ChatMessage workMessage = trace.getWorkingMemory().getLastMessage();
  8.         if (workMessage instanceof AssistantMessage) {
  9.             trace.getWorkingMemory().removeLastMessage();
  10.         }

  11.         [i]// 回退一条 ai 历史消息(要重新生成)[/i]
  12.         List<ChatMessage> messageList = session.getMessages();
  13.         if (Assert.isNotEmpty(messageList) && messageList.get(messageList.size() - 1) instanceof AssistantMessage) {
  14.             session.removeLatestMessage(1);
  15.         }
  16.     }
  17. }

  18. ctx.runAgentTask(null, null);
复制代码

核心逻辑:

1. 检查 trace 状态必须是 ID_END(已完成)
2. 将 route 重置为 ID_REASON(回到思考阶段)
3. 清空 finalAnswer(让 AI 重新生成)
4. 回退最后一条 AI 消息
5. 用空的输入继续运行


结果: 旧气泡保留,新内容追加在后面。
两个按钮的对照表


维度         Re-run(重新运行)         Continue(继续运行)

是否删除旧响应         :white_check_mark: 删除         :x: 保留

是否清空历史         :white_check_mark: 剥除后续消息         :x: 保留完整历史

是否重置 trace         :white_check_mark: 重置         :x: 仅重置 route

输入         同一个用户输入         空输入

适用场景         答错了想重答         答到一半断了

是否可链式操作         可(再 Re-run)         可(再 Continue)

三个具体场景
场景 A:AI 答错了

问题: "1 + 1 = ?" AI 回答"3"

操作: 点击 Re-run

结果: - 旧气泡"3"被删除 - 新气泡"2"出现 - 历史回到问题本身
场景 B:AI 答到一半断了

问题: 长文本生成到一半断了

操作: 点击 Continue

结果: - 旧气泡保留(已生成的部分) - 新气泡追加在后面 - 内容无缝衔接
场景 C:先 Re-run 再 Continue

问题: 想换个思路但保留部分内容

操作: 1. 点击 Re-run → 得到新回答 A 2. 点击 Continue → 在 A 后面追加 B

结果: 最终有两个气泡,A 和 B 都是新内容
runId 联动机制

两个按钮都依赖一个关键字段:runId。

作用: 同一轮对话的所有气泡共享同一个 runId。

联动效果: - Re-run 时,删除该 runId 下的所有气泡 - Continue 时,新气泡也使用同一个 runId

实现:

  1. [i]// Web UI 中,每个气泡都有 data-run-id 属性[/i]
  2. <div class="message" data-run-id="abc123">
  3.   <!-- 内容 -->
  4. </div>

  5. [i]// Re-run 时,JS 会删除所有 data-run-id="abc123" 的元素[/i]
  6. $('&#91;data-run-id="' + runId + '"&#93;').remove();
复制代码

好处: - 用户看到的是一整轮对话 - 不需要手动删除单个气泡 - 保持了对话的原子性
三端可用

这两个命令不仅存在于 Web UI,还有三个入口:
1. CLI 命令行

  1. soloncode > /rerun    [i]# 重新运行[/i]
  2. soloncode > /continue [i]# 继续运行[/i]
复制代码
2. Web UI

点击工具栏的 Re-run / Continue 按钮。
3. IM 机器人

在飞书/钉钉/微信中输入 /rerun 或 /continue。
总结

Re-run = 删除旧回答 + 同输入重跑
Continue = 保留旧回答 + 空输入续跑


两个命令底层实现完全不同,但都通过 runId 联动保持对话完整性。

掌握这两个"后悔药",能让 AI 对话更流畅,出错也能快速修正。

原文链接

打赏作者

当前余额:0 Token,打赏后立即到账

主题

0

回帖

0

积分

积分
0
发表于 2026-8-26 20:15:01 | 显示全部楼层
SolonCode在实际项目里有没有踩过坑?想听楼主展开讲讲。

主题

0

回帖

0

积分

积分
0
发表于 2026-8-26 21:45:01 | 显示全部楼层
收藏了,明天上班路上细读,fire持续关注中。

主题

0

回帖

0

积分

积分
0
发表于 2026-8-26 22:45:01 | 显示全部楼层
写得很详细,感谢楼主的整理,辛苦了。

主题

0

回帖

0

积分

积分
0
发表于 2026-8-26 23:45:01 | 显示全部楼层
从头看到尾,收获不少,感谢分享。

主题

0

回帖

0

积分

积分
0
发表于 2026-8-27 00:15:01 | 显示全部楼层
支持一下,希望后面多写写fire相关的实战内容。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

{ template common/footer}