本页面内容已迁移至 分布式存储 — JDBC。以下内容保留作为参考,但建议使用新文档。
MySQL 状态存储
agentscope-extensions-mysql 把 AgentScope 的 Agent 状态持久化到 MySQL。适合已有 MySQL 基础设施、需要事务和 SQL 查询能力的场景。
添加依赖
mysql:mysql-connector-j)。
快速上手
自定义库名 / 表名
[a-zA-Z_][a-zA-Z0-9_-]*,长度 ≤ 64,避免 SQL 注入。
表结构
createIfNotExist=true 时会自动建表:
utf8mb4_bin,而表级默认排序规则仍为 utf8mb4_unicode_ci:session_id 与 state_key 是大小写敏感的标识符,而表级默认排序规则大小写不敏感,若不指定二进制排序规则,两个仅大小写不同的 id 会在主键上冲突、共用同一行。注意 utf8mb4_bin 为 PAD SPACE 语义——仅尾部空格不同的值仍视为相等。
迁移在此改动之前创建的表
CREATE TABLE IF NOT EXISTS 不会修改已存在的表,因此更早部署的实例仍保持大小写不敏感,需要由运维执行迁移。agentscope_store、agentscope_sessions、agentscope_snapshots 三张表的主键都是调用方提供的标识符,道理相同:
agentscope_snapshots 的两条路径——agentscope-extensions-jdbc 方言与 legacy 的 agentscope-extensions-mysql 快照客户端——现在钉的是同一个排序规则,因此更早部署的实例只需执行上面的语句。
有两点需要提前考虑:
-
读取语义随排序规则一起改变。 比较与前缀查询(
session_id = ?、LIKE 'prefix%')变为大小写敏感,原先用小写sess-1能查到SESS-1的场景将不再匹配。请在会话空闲窗口执行迁移。 -
已有数据可能已经丢失。 若迁移前曾写入两个仅大小写不同的键,第二次写入会通过
ON DUPLICATE KEY UPDATE覆盖第一次,那一行无法从表中恢复。 -
(userId, sessionId)二元组会被打包进session_id列,形如{userSegment}:{sessionId}(userSegment为userId,匿名 session 用__anon__)。 -
单值:
item_index = 0 -
列表:
item_index = 0,1,2,...,每项一行;同时另存一行state_key='xxx:_hash'用作变更检测。
直接使用 API
MysqlAgentStateStore 实现了 AgentStateStore 接口,常用调用如下:
配置参数说明
truncateAllSessions()使用TRUNCATE TABLE,需要 DROP 权限;DDL 不可回滚,仅用于测试或运维清理。