Skip to content

feat: switch to HarnessAgent with Redis sessions - #3

Merged
sinabs merged 12 commits into
mainfrom
feat/02-harness-redis
Nov 6, 2026
Merged

sinabs merged 12 commits into
mainfrom
feat/02-harness-redis

Conversation

@sinabs

@sinabs sinabs commented Nov 6, 2026 •

Copy link
Copy Markdown
Owner

概要

第 02 轮:把 ReActAgent 换成 HarnessAgent,会话历史放进 Redis,版本号升到 2.0.0。

主要改动

  • HarnessAgentFactory 每请求新建 HarnessAgent(HarnessAgent.Builder 不能共享,连续 build 中间件会累积)
  • 会话按 (userId, sessionId) 寻址,状态存到 Redis(RedisDistributedStore),连接串启动期校验并 ping,连不上启动即失败,报错中连接串脱敏
  • 压缩按条数触发(yoke.compaction.triggerMessages / keepMessages),非法值回落到默认
  • 日志中间件,不记录工具参数与输出
  • 装配期关闭文件系统、shell、联网和子 Agent 工具
  • 启动时在工作区创建默认 AGENTS.md,消除 AgentScope 的启动警告
  • 根目录 docker-compose.yml,集成测试用 Testcontainers 的 ComposeContainer 拉起真实 Redis
  • 工具黑名单:拒绝 web_fetch、web_search 和读类的记忆与会话工具,防止模型读到别的用户的数据;工作区 tools.json 不再生效
  • Agent 在结果交给调用方之后才关闭,关闭失败只记日志,不把成功的对话变成 500
  • 清理 IDEA 警告;README 中英同步

测试

./gradlew test:134 个测试全部通过,0 个失败,0 个跳过(需要本机有 Docker)。

说明

  • 已合入 feat/01-sse-streaming 与 feat/011-sse-ag-ui,流式接口为 AG-UI 版本

sinabs added 12 commits November 1, 2026 22:27
Agent 由 ReActAgent 换成 HarnessAgent,会话历史落到 Redis,
并补上日志中间件和装配期的权限收紧。

- HarnessAgentFactory:2.0.4 的 HarnessAgent.Builder 每次 build 都会
  往内部追加中间件,不能共享,所以工厂只共享模型、存储、配置和中间件,
  Builder 每请求现建,仍用 Mono.using/Flux.using 保证关闭
- 会话:userId 可选(缺省 default),userId 与 sessionId 受 SafeId 约束,
  避免拼槽位时撞车;状态走 RedisDistributedStore,启动期 ping 失败即
  快速失败,连接串在报错和日志中一律脱敏
- 压缩:按条数触发,阈值走 yoke.compaction 配置,非法值回落默认
- 中间件:LoggingMiddleware 记录 agentId、sessionId、耗时和工具名,
  不记录工具参数与输出
- 权限:装配期关闭文件系统、shell、联网工具和子 Agent
  (子 Agent 不继承联网工具的关闭设置)
- 新增 docker-compose.yml(Redis),测试通过 Testcontainers 读取同一份
  文件拉起真实 Redis,本机无 Docker 时跳过,CI 中改为失败
- 排除 agentscope-extensions-redis 带入的 redisson 与 lettuce
- 补充历史、重启恢复、快速失败、压缩、权限、脱敏等测试,README 中英同步
把第 01 轮之后的改动合入第 02 轮分支:天气工具、UTF-8 流式响应、
火山方舟 local 配置、版本号 1.0.0 等。

冲突处理:
- AgentConfiguration:保留 HarnessAgentFactory,天气工具改为注册到
  共享 Toolkit 并传给工厂(02 里已经没有共享的 ReActAgent.Builder)
- HarnessAgentFactory:新增 toolkit 参数,创建 HarnessAgent 时传入
- AgentConfigurationTests、ChatHistoryTests:沿用 02 的写法
  (ApplicationContextRunner、support 里的假模型、uniqueId 隔离会话)
- ProfilesTests、README:合并 local 改用 ARK_API_KEY 的描述
- ChatController:合并后 StringUtils.hasText 已不存在,改为
  StrUtil.isNotBlank
- 新增测试:模型能看到 get_weather,且连续两次新建的 Agent 都带着它
把流式接口的 AG-UI 协议合入第 02 轮,解决冲突如下:
- ChatController 同时使用 HarnessAgentFactory 与 AguiStreamCodec;AG-UI 请求体没有用户标识,流式接口固定归属 default 用户
- AguiStreamCodec.stream 的参数从 ReActAgent 放宽为 Agent,适配器本身支持 HarnessAgent
- SafeId 合并两边:保留 userId 的说明和 RECORD_COMPONENT 目标,加入 isSafe 供必填入口调用
- ChatRequest 保留 userId;README 中英文、ChatApi、测试同步
- HarnessAgentFactory 改为组件,由容器注入模型、存储、配置和中间件,删除只剩一个 Bean 的 AgentConfiguration
- WeatherTool 直接作为组件,双参构造器交给 Lombok 生成
- 按 CLAUDE.md 统一判空写法:Objects.isNull/nonNull 与 Optional
- 注释里的具体版本号 2.0.4 改为 AgentScope,并调顺相关句子
- application.yml 补充 Redis 连接串的写法示例(注释)
- README 中英文补充 Redis 里会话状态的键结构和内容(真实模型实测)
- 介绍改为友客AI的开源项目,说明大家一起学习 AgentScope Java V2 与 Spring 并做出 Agent 服务
- 新增 4 句钩子,讲用 AgentScope 做 Agent 服务时会遇到的问题
- 原来的要点列表整理为「特性」小节,去掉请求参数校验一条
- 中英文同步
- 精简介绍段,保留轭的由来,钩子改写得更直接
- 特性小节措辞微调,中英文同步
AgentScope 的 WorkspaceManager 每次请求都会在工作区根目录找 AGENTS.md,
找不到就打 WARN。新增 WorkspaceInitializer,启动时缺文件就写一份最小的默认内容,
已存在的文件不覆盖。同时把 YokeProperties.Compaction 的手写 logger 换成 @slf4j。
keepMessages 大于 0 且小于 triggerMessages 已经蕴含 triggerMessages 大于 0,
去掉多余的 triggerMessages <= 0 判断,逻辑不变。
按 IDEA 检查结果清理警告:重写方法的参数加 JSpecify @nonnull,
没用到的 lambda 参数写成 _,去掉多余的 concurrencySafe 默认值,
测试里改用菱形、方法引用、getFirst() 等写法,Redis.toString 返回值标注 @nonnull。
ArchUnit 规则字段、反射调用的工具方法等误报保持原样。
02 轮换成 HarnessAgent + Redis 会话,对外行为变化较大,版本号升到 2.0.0。
压缩后 summary 字段实测一直为空,摘要放在 context 的第一条消息里;同步更正工具可见范围、流式请求体 content 的限制说明,中英两份 README 保持一致。
- 显式传入工具配置:拒绝 web_fetch、web_search 和读类的记忆与会话工具(memory_get、memory_search、session_history、session_list、session_search),避免模型读到别的用户的记忆和会话;工作区 tools.json 不再生效
- Mono.using / Flux.using 改为 eager=false:结果交给调用方之后再关闭 Agent,关闭失败只记日志,不把成功的对话变成 500,流式也不会在 RUN_FINISHED 之后追加 RUN_ERROR
- 流式请求体的 content 是内容块形式时直接返回 400,并给出准确原因
- 补充对应测试(HarnessAgentToolsTests、AguiStreamCodecTests、ChatControllerTests),更新 ChatApi 文档
@sinabs
sinabs merged commit 2cb1e12 into main Nov 6, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant