假设sessionid是已经确定(例如前端传值)

那么我们考虑的就只有

  • session的load,save在什么时候执行(展示给agent看的)
  • 消息持久化usermessage+assistmessage(展示给用户看的)
  • 表结构

消息持久化

usermessage好办,收到用户message的时候即可直接调用save

assistmessage,也是可以在agent调用结束后使用

💡 > 注意这里应该选择在完成任务后的.subscribe调用里面,原因是:若放在Hook里面,返回保存的包括了一些非聊天agent的信息(比如意图识别agent);若放在call后面,则不能把Mono里面的信息当成AI回复

会话持久化

agent想要的不光除了这些message,还应该有tool类信息等等(如果你配合使用agentscope的上下文压缩,这里可能还需要压缩信息)

Session无非就是load加save,时机因该选择在.call后面,如刚才消息持久化里面讲的一样,可以拿到agent需要的信息。

但是多智能体业务里面,频繁的.loadIfExists和.saveTo是明显可以用hook替代的

hook配置内部判断事件是precallevent和postcallevent分别.loadIfExist和.saveTo即可

到这里会发现,同一session,似乎放了所有的涉及到的agent,这里显然也需要区分不同agent,方便调用,那么我们可以使用Session自带的(session,sessionkey),给不同agent配不同的key标识

💡 这里会发现hook的onEvent是传入event,无法获得前端的sessoinId,那么这里只能是用reactor框架的reactor context,走订阅链来获取携带的信息
同样的,在切换agent如果涉及到订阅链切换需要做一个contextwrite写入session确保后面的hook可以读到

库表

接着上面,既然sessionkey这里有了,那么库表完全可以sessionid+sessionkey做唯一标识

bgg1s