假设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做唯一标识