当前位置: 首页 > news >正文

Agent Scope Java 2.x 系列【18】Harness:从零搭建 MySQL 工作区

文章目录

  • 1. 架构概览
  • 2. 环境准备
    • 2.1 MySQL 安装
    • 2.2 创建数据库
  • 3. 项目配置
    • 3.1 Maven 依赖
    • 3.2 schema.sql — 建表
    • 3.3 相关配置
      • 3.3.1 应用配置:application.yml
      • 3.3.2 JDBC 分布式存储配置
    • 3.4 构建 HarnessAgent
  • 4. 工作原理
    • 4.1 命名空间路由
    • 4.2 数据读写流程
    • 4.3 Overlay 模式
  • 5. 验证
    • 5.1 启动服务
    • 5.2 发送对话
    • 5.3 检查 .agentscope
    • 5.4 检查 MySQL 数据

AgentScope HarnessAgent的工作区从本地磁盘迁移到MySQL,实现多实例共享记忆、技能、会话日志。

1. 架构概览

┌───────────────┐ ┌───────────────┐ │ 实例 A │ │ 实例 B │ │ HarnessAgent │ │ HarnessAgent │ └───────┬───────┘ └───────┬───────┘ │ │ └──────────┬──────────┘ │ ┌────────▼────────┐ │ MySQL Server │ │ │ │ agentscope_store │ ← 工作区 KV(JdbcStore) │ agent_state │ ← Agent 会话状态(MysqlAgentStateStore) └──────────────────┘

核心组件:

组件作用存储位置
JdbcStore工作区文件 KV 存储(MEMORY.md、skills、sessions 等)agentscope_store
MysqlAgentStateStoreAgent 会话状态持久化agent_state表(框架自动创建)
RemoteFilesystemSpec将工作区路由到远程存储配置层,不存数据

2. 环境准备

2.1 MySQL 安装

# Docker 方式(推荐)dockerrun-d--namemysql-agentscope\-eMYSQL_ROOT_PASSWORD=root123\-eMYSQL_DATABASE=agentscope\-p3306:3306\mysql:8.0\--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

2.2 创建数据库

CREATEDATABASEIFNOTEXISTSagentscopeDEFAULTCHARACTERSETutf8mb4DEFAULTCOLLATEutf8mb4_unicode_ci;

3. 项目配置

3.1 Maven 依赖

pom.xml中添加:

<!-- AgentScope Harness --><dependency><groupId>io.agentscope</groupId><artifactId>agentscope-harness</artifactId><version>2.0.0-RC2</version></dependency><!-- AgentScope MySQL 扩展(提供 JdbcStore + MysqlAgentStateStore) --><dependency><groupId>io.agentscope</groupId><artifactId>agentscope-extensions-mysql</artifactId><version>2.0.0-RC2</version></dependency><!-- Spring Boot JDBC --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- MySQL 驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

3.2 schema.sql — 建表

文件路径:src/main/resources/schema.sql

-- JdbcStore KV 表-- 关键:MySQL utf8mb4 下联合主键最大 3072 字节-- VARCHAR(300) + VARCHAR(200) = 500 字符 × 4 字节 = 2000 字节,安全落在限制内CREATETABLEIFNOTEXISTSagentscope_store(namespace_pathVARCHAR(300)NOTNULLCOMMENT'命名空间路径,用 0x1F 分隔',item_keyVARCHAR(200)NOTNULLCOMMENT'条目 Key',value_jsonLONGTEXTNOTNULLCOMMENT'JSON 序列化的值',versionBIGINTNOTNULLDEFAULT0COMMENT'乐观锁版本号',updated_atBIGINTNOTNULLDEFAULT0COMMENT'更新时间(epoch millis)',PRIMARYKEY(namespace_path,item_key))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

3.3 相关配置

3.3.1 应用配置:application.yml

server:port:8090spring:application:name:agentscope-demodatasource:url:jdbc:mysql://localhost:3306/agentscope?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTCdriver-class-name:com.mysql.cj.jdbc.Driverusername:rootpassword:${MYSQL_PASSWORD:root123}sql:init:mode:alwaysschema-locations:classpath:schema.sqlagentscope:api-key:${DASHSCOPE_API_KEY:your-api-key}

3.3.2 JDBC 分布式存储配置

DistributedStore:分布式持久化存储组件一站式统一配置入口

解决痛点:不用分别单独注入AgentStateStoreBaseStore、沙箱快照、沙箱锁四类组件,统一封装后传给HarnessAgent.Builder一键挂载存储体系。

示例1:同介质统一存储(Redis全套承载):

DistributedStorestore=RedisDistributedStore.fromJedis(jedis);

示例2:混合异构存储(MySQL存业务数据,Redis做沙箱控制):

DistributedStorestore=DistributedStore.builder().agentStateStore(mysqlStore.agentStateStore()).baseStore(mysqlStore.baseStore()).sandboxSnapshotSpec(redisStore.sandboxSnapshotSpec()).sandboxExecutionGuard(redisStore.sandboxExecutionGuard()).build();

这里,使用配置Agent会话状态、工作区使用JDBC存储:

@ConfigurationpublicclassAgentScopeConfig{// ==================== JDBC 分布式存储 ====================@BeanpublicDistributedStoredistributedStore(DataSourcedataSource){returnDistributedStore.builder()// Agent 会话状态走 MySQL(自动建表).agentStateStore(newMysqlAgentStateStore(dataSource,true))// 工作区文件 KV 走 MySQL(表由 schema.sql 创建,不自动建表).baseStore(JdbcStore.builder(dataSource).initializeSchema(false).build()).build();}}

3.4 构建 HarnessAgent

构建HarnessAgent时配置:

  1. 本地文件工作区
  2. 注入分布式存储
  3. 启用远程文件系统(BaseStore自动注入)
@ConfigurationpublicclassAgentScopeConfig{// ==================== HarnessAgent ====================@BeanpublicHarnessAgentharnessAgent(Modelmodel,DistributedStorestore,Toolkittoolkit){PathworkspacePath=Paths.get(System.getProperty("user.home"),".agentscope","workspace","demo-agent");try{java.nio.file.Files.createDirectories(workspacePath);}catch(Exceptionignored){}returnHarnessAgent.builder().name("harness-demo").model(model).workspace(workspacePath).toolkit(toolkit).sysPrompt("你是一个有用的 AI 助手。")// 注入分布式存储.distributedStore(store)// 启用远程文件系统(BaseStore 自动注入).filesystem(newRemoteFilesystemSpec().isolationScope(IsolationScope.USER)).maxIters(5).build();}}

CompositeFilesystem实例中,可以看到优先使用【远程文件系统】:


4. 工作原理

4.1 命名空间路由

RemoteFilesystemSpec将工作区目录按路径前缀分片路由到agentscope_store表的不同命名空间:

工作区路径MySQL namespace_path 前缀
AGENTS.mdMEMORY.mdtools.jsonagents/harness-demo/users/<uid>/+root
memory/.../memory
skills/.../skills
subagents/.../subagents
knowledge/.../knowledge
agents/<id>/sessions/.../sessions
agents/<id>/tasks/.../tasks

每个namespace_path段之间用ASCII0x1FUnit Separator)分隔,支持前缀搜索。

4.2 数据读写流程

Agent 读取 AGENTS.md │ ├─ RemoteFilesystem.read("AGENTS.md") │ └─ JdbcStore.get(["agents","harness-demo","users","uid","root"], "AGENTS.md") │ └─ SELECT value_json FROM agentscope_store │ WHERE namespace_path = 'agentsharness-demousersuidroot' │ AND item_key = 'AGENTS.md' │ ├─ 如果远程没有 → 回退到本地工作区模板文件(Overlay 下层) │ Agent 写入 MEMORY.md(copy-on-write) │ └─ RemoteFilesystem.write("MEMORY.md", content) └─ JdbcStore.put(["agents","harness-demo","users","uid","root"], "MEMORY.md", value) └─ UPDATE ... SET value_json = ?, version = version + 1 WHERE namespace_path = ? AND item_key = ?

4.3 Overlay 模式

每条路由采用双层结构:

  • 上层(RemoteFilesystem):可读写,数据存入MySQL,用户修改的版本在这里
  • 下层(LocalFilesystem,只读):本地工作区模板文件作为基线

Agent读取时优先取上层(MySQL),上层没有则回退到下层(本地模板)。写入始终去上层。


5. 验证

5.1 启动服务

mvn spring-boot:run-plagentscope-demo

观察日志确认没有报错:

JdbcStore built: table=agentscope_store, dialect=... HarnessAgent built: name=harness-demo (JDBC RemoteFilesystem mode)

5.2 发送对话

curl"http://localhost:8090/agent/harness/call?query=今天天气怎么样&userId=demo&sessionId=test-001"

5.3 检查 .agentscope

本地磁盘并不是没有任何数据,有些数据会永远同步写入本地磁盘:

5.4 检查 MySQL 数据

-- 查看命名空间分布SELECTnamespace_path,COUNT(*)ASitemsFROMagentscope_storeGROUPBYnamespace_pathORDERBYnamespace_path;-- 查看具体条目SELECTnamespace_path,item_key,LEFT(value_json,100)ASpreview,versionFROMagentscope_storeORDERBYnamespace_path,item_key;

预期会看到类似数据:

namespace_path | item_key | preview agents/harness-demo/users/demo/root/ | MEMORY.md | {"content":"...","encoding":"utf-8"} agents/harness-demo/users/demo/sessions/ | test-001.log | {...}


http://www.rkmt.cn/news/1530652.html

相关文章:

  • 上线72小时就“猝死“!Claude Fable 5被美国政府一纸禁令全球断服
  • 2026年6月,重庆音响改装门店助你提升车内音质,坦克原厂音响升级/问界原厂音响升级/汽车音响改装,音响改装品牌哪个好 - 音响改装门店分享
  • MPC860 ATM调度与中断机制:从硬件原理到软件配置实战
  • Outlook邮件变‘隐形’?从字体颜色到显卡驱动,一份给IT支持人员的深度排错清单
  • 大模型MoE稀疏激活原理与硬件适配实战
  • 高效网页内容管理实战指南:MarkDownload浏览器插件深度解析与实战应用
  • 从px到rem/vw/rpx:聊聊前端响应式布局中那些“单位”的实战选择与避坑
  • 2026青岛黄金回收门店实测测评|诚信靠谱商家真实盘点推荐 - 奢侈品回收测评
  • 智能消息同步完全指南:告别手动转发的微信自动化解决方案
  • 百考通AI智能实践报告,精准分层适配,让实践总结高效又专业
  • MPC8533E eTSEC MAC寄存器深度配置:从CSMA/CD到DMA的嵌入式网络调优实战
  • 猫抓终极指南:如何快速免费抓取网页视频和音频资源
  • Akagi:如何在5分钟内将你的雀魂游戏提升到专业水平
  • Auto.js/Pro版/AutoX.js到底怎么选?2024年安卓自动化脚本工具避坑指南
  • 2026 东莞闲置翡翠出手指南,正规实体回收排行,全程无隐形收费 - 奢侈品回收测评
  • STL转STEP终极方案:用stltostp轻松实现3D模型格式的专业转换
  • 2026年京东云萌新流程:怎么安装OpenClaw?Token Plan配置及大模型Skill设置
  • 意图共鸣科技《历史的韵脚》:读后随笔——技术能力从集中到下放,为何总是经历这三步?
  • e200z1 MMU机制解析:G位、控制寄存器与TLB管理实战
  • 2026年本地零基础教程:怎么集成OpenClaw?Token Plan配置与大模型Skill接入
  • MPC8533E eTSEC控制器:从信号时序到寄存器配置的嵌入式网络驱动实战
  • 3个痛点,1个神器:G-Helper重塑你的华硕笔记本体验
  • 抖音直播数据抓取:5分钟实现实时弹幕监控与分析
  • AI项目实战指南:从本地多模态应用到工程化交付
  • 百考通AI毕业论文智能生成,精准分层适配,让学术创作高效又专业
  • 如何用Upkie开源轮式双足机器人快速入门机器人开发:完整教程指南
  • HunterPie:5分钟掌握《怪物猎人世界》实时监控与数据可视化神器
  • 深度解析:5大创新点重塑DLSS-G到FSR 3帧生成技术生态
  • 3步快速上手!在Mac上运行Windows应用的终极免费方案
  • AI写代码的工程落地:从语法正确到生产就绪的四层跃迁