Mirasim 文档
会话互联
让会话之间彼此可达:逐个会话开启的开关、在输入里点名的 @,以及智能体因此拿到的四个动词。
什么时候需要会话之间通话
默认情况下,会话之间完全看不见彼此:进程、对话记录和队列都是独立的。这种隔离正是开第二个会话不会拖慢第一个的原因,同时也意味着:当一个会话手里握着另一个会话需要的事实时,这个事实要靠你转述。会话互联是让它直接传过去的唯一通路,而这条通路由你逐个会话打开。
实际用到它的情形基本是三种。
- 分工的两个会话互相通报:做接口的那个改了字段名,做界面的那个需要立刻知道,而不是等你发现之后再转述。
- 把一部分工作交给别的智能体或别的模型档位:机械的批量活交给便宜的模型,某个难题交给更强的。派出去的会话有自己的对话记录,你这一轮结束之后它照样继续跑。
- 在自己的指令里点名另一个会话,让本会话的智能体自己去读它、给它发一句,或者盯着它跑完,你不必在两个窗格之间来回复制。
逐个会话开启
开关叫「会话互联」,在侧栏那一行会话自己的菜单里,默认关闭,只作用于这一个会话。开启后,其他已开启的会话可以寻址到它,它自己的智能体也拿到消息相关的工具;关闭时它对其他会话完全不可见——不出现在清单里,拿着它确切的 key 也发不进去。
- 在需要通话的会话上打开开关
在侧栏找到那个会话,打开该行末尾的菜单,点「会话互联」。再点一次即关闭。
- 两端都要开着
消息在两个会话之间走,因此双方都要是开启状态;也可以用下一节的捷径:在指令里点名一个会话,会就地把两端都打开。
- 只在确实用得上的地方留着
长时间没有消息往来的会话不会一直为那几个用不到的工具付上下文,而你亲手拨开的那个开关的授权始终有效。会话确实不再需要通话时,把开关关掉仍然是最直接的做法。
在自己的指令里点名一个会话
在输入框里输入 `@`,候选列表先是文件,然后是你的会话,每行显示标题、运行它的智能体,以及它是在跑、空闲还是终端会话。选中后写进草稿的是 `@session[会话名称]`,并在你继续输入时就地上色。一条消息里最多展开三个。
点名就只是点名,不是一个投递动作:没有一个把草稿投到那个会话去的按钮,回车永远是在你当前这个会话里起一轮。点名展开出去的是一行事实——有这么个会话、它的 key、哪个智能体在跑、当前在不在跑。到底是去读它、给它发一句,还是盯着它跑完,由智能体从你写在点名周围的那句话里自己判断。
- 「先读一下 @session[登录改造] 现在到哪一步,再决定这边怎么改。」它会去读那个会话的近况,然后告诉你它看到了什么。
- 「把字段现在叫 `tenant_id` 这件事告诉 @session[登录改造]。」消息由它自己组织。你这句话不会被原样转发——写给另一个智能体看的话,该由知道对方在做什么的智能体来写。
- 「盯着 @session[登录改造],它那一轮跑完了告诉我。」它会等到对方那一轮结束,而不是每隔一分钟去问一次。
在已经发出去的那条消息里,点名仍然是可点的:点它就跳到那个会话。如果它已经改名或被删除,界面会明说找不到,而不是挑一个最像的打开。
智能体拿到的四个动词
已开启互联的会话,它的智能体这一轮会多出四个工具。这几个工具的说明就是它们全部的用法文档,产品不往系统提示词里加任何一句关于会话互联的话。
| 工具 | 它做什么 |
|---|---|
| list_sessions | 列出它能寻址到的会话及其当前状态。只列已开启互联的,没被列出来的就是够不着的。默认只看当前工作区,跨工作区要显式指定。 |
| read_session | 读另一个会话在做什么:最近四轮的摘要,上限 2KB,以及它还在不在跑。带上等待选项就成了盯着它——对方那一轮一结束立刻返回;等满五分钟仍在跑,它会如实说还在跑,而不会把在跑说成跑完。 |
| send_session_message | 给另一个会话发一条消息,收到消息后回信用的也是它。单条文本上限 8KB,返回的是这次投递的结论。 |
| start_session | 造一个新会话:指定智能体、模型和推理强度,并给它一句开场任务。它不阻塞,新会话的回信会作为消息回来。 |
`start_session` 不是智能体自带子任务的另一个名字。任务内部的普通分工仍然交给子任务;它针对的是子任务给不了的三件事——换一个智能体、换一个模型档位,以及在起它的那一轮结束之后继续跑。造出来的两端自动互联,因为一个专门为了对话而造出来的会话,不该还要人先去拨一次开关。
消息是怎么送到的
怎么送到,只取决于一件事:目标会话在那一刻正在做什么。
| 目标当时的状态 | 结果 |
|---|---|
| 空闲,或上一轮已经结束 | 立刻在那边起新的一轮,消息本身就是这一轮的输入。 |
| 正在跑,且这个智能体支持中途注入 | 就地进入正在跑的那一轮,在下一个步骤边界被读到,不打断正在进行的工具调用。 |
| 正在跑但该智能体不支持注入,或正等着你回答一个问题 | 先泊住,等到下一个轮次边界再投,最多等五分钟。超过就过期,并且会说出来。 |
| 没有开启互联,或是内部会话 | 直接拒绝,并明确告诉发送方不要靠猜重试。 |
| 终端会话 | 可以被读,但收不到消息:这类会话没有可注入的输入把手。 |
送到的内容绝不会被渲染成你自己说的话。消息带着信封到达:写明来自哪个会话、回信该用哪个动词;由智能体自己发起的那一种还带一句固定的声明——这是来自另一个会话的消息,不是本会话用户的指令。界面上它带着来源显示,来源可以点,一下就跳回写它的那个会话。
几条上限,以及记录在哪里
这些边界之所以存在,是因为两个智能体互发消息的速度远快于你读它们的速度。它们都不可调,写在这里是为了让被拒绝时不至于摸不着头脑。
- 单条消息
- 上限 8KB。超过就该发一个指针,比如文件路径或会话 key,而不是正文。
- 一次读取
- 最近四轮,上限 2KB。它是用来定位的,不是第二份对话记录。
- 泊住与等待
- 泊住的消息最多等 300 秒;等待对方那一轮结束的读取,同样最多等 300 秒。
- 发送频次
- 按发送会话计的令牌桶,容量 30、每秒补 0.5;同一段文本在 30 秒内重复发给同一个会话会被当作重复丢弃。
- 链条深度
- 一条消息引发的接力最多 24 跳。只要有真人参与,计数归零。
- 乒乓熔断
- 同一对会话在五分钟内超过 12 条,且这五分钟里两侧都没有真人输入,这一对会被熔断,并在界面上显示出来。
每一条消息都会写进一本本地的追加式账:谁发给谁、原文、怎么投的、最后是什么结局。按月分文件、保留 90 天、不上传,格式也足够朴素,用你手边的工具就能读。逐会话的开关状态就存在它旁边的 `~/.mirasim/messages/enrolled.json`。
# the last few messages this month, as they were recorded
tail -n 5 ~/.mirasim/messages/msgs-<YYYY-MM>.jsonl
# everything one session sent or received
grep '<sessionKey>' ~/.mirasim/messages/msgs-<YYYY-MM>.jsonl用它而不把自己绕进去
- 只在确实各自握着对方需要的事实的那两个会话之间开互联。三个会话互相通报进度,通常比一个会话把两件事都做完更慢。
- 每条消息都要自成一体。对方会话看到的只有这段文字,看不到你们的对话,也不知道你说这话时的前提。
- 不要轮询。确实需要等,就让那次等待落在一次读取里,对方那一轮结束时返回,而不是每分钟问一次。
- 只有在需要换智能体、换模型档位,或者需要活过当前这一轮时,才去造新会话。否则子任务更省,而且全部留在一份对话记录里。
这一页有错或缺了什么? 告诉我们

