Skip to content

v0.23.0

Choose a tag to compare

@Kaiji-Z Kaiji-Z released this 22 Aug 17:14
· 31 commits to main since this release

v0.23.0 turns conversations into async sessions. While the AI is still thinking, you can jump to another node, start a fresh conversation there, and come back later to find the first answer finished and sitting in its own place. Phone users found the crash first, but the same wound bled on desktop too.

Streaming now belongs to the thread, not the screen. The streaming events used to carry no thread identity, and a single global flag said an answer was in progress. Switch nodes mid-answer and the two conversations bled into each other, the finish event rewrote message ids in the wrong thread, and the composer in the new node stayed locked until you reloaded. Each thread now keeps its own bucket of streaming state, events route by thread id, and buckets holding answers still in flight are never evicted from the cache, so coming back restores the half-written answer exactly as it was.

The old switch lock is gone because the disease is cured. Blocking node switches during streaming was a bandage over a routing bug. Now you can switch nodes, threads, or create new conversations while an answer is running. The same thread still refuses a second send until its current answer finishes, which keeps the stop button honest. Across threads, send freely; two nodes can stream at the same time.

You can watch it happen. A spinner sits on the tab of any thread that is still answering, the map node it belongs to wears a small spinner at its corner, and the map banner now says the AI is answering in the background and you are free to move around.

The phone menus are readable again. On touch screens, opening the effort or model picker squeezed every menu item into a forty-four pixel sliver, because the touch stylesheet written for toolbar icons also hit the menu items that live inside the toolbar. The rule now steps around menu items on purpose, and the model and context popovers learned to respect narrow viewports as well.


v0.23.0 把对话改成了异步会话。AI 还在想的时候,你可以跳去别的节点,在那里开一段新对话,晚点回来,第一个回答已经写完,待在它自己的位置上。这个问题是手机用户先撞见的,桌面端其实同病。

流式输出现在记在会话名下,视图只是观察窗口。 过去流式事件不携带会话身份,一个全局开关声明「有回答正在进行」。回答中途切节点,两段对话就互相渗血,收尾事件把消息 id 换错线程,新节点的输入框一直锁到刷新为止。现在每个会话各持一只流式状态桶,事件按会话 id 分流,装着未完成回答的桶永不淘汰,回到原会话时,写了一半的回答原样恢复。

切换锁拆掉了,因为病根治好了。 流式期间禁止切节点,原本是盖在路由错误上的创可贴。现在回答进行中,切节点、切会话、新建会话都随意。同一段会话在一个回答跑完之前仍拒绝第二条发送,停止按钮因此保持诚实。跨会话随便发,两个节点可以同时流式。

看得见它在跑。 还在回答的会话,标签上有一颗转圈;它所属的地图球,右上角挂一颗小转圈;地图提示条也改成「AI 正在后台回答,可随意切换节点」。

手机上的菜单恢复正常了。 触屏上打开思考强度或模型菜单,每个菜单项被挤成四十四像素的窄条,因为给工具栏图标写的触屏样式,同样打在了住在工具栏里的菜单项上。这条规则现在明确绕开菜单项,模型菜单和上下文弹层也学会了尊重窄视口。