Memory and Tool Boundaries
这一页只讲边界。把 memory、tool 和 MCP 分开,才能知道 Core SDK 到底负责到哪里。
1. ChatMemory 负责什么
ChatMemory 负责的是会话事实内容:
- system / user / assistant 消息
- 多模态用户输入
- assistant 发起过的 tool calls
- tool output 回写结果
Chat/Responses可复用的上下文投影- 上下文裁剪、摘要、快照和恢复
它的职责本质上是:保存“模型下一轮需要再次看到的事实”。
2. 为什么 addToolOutput(...) 不代表它成了工具系统
ChatMemory 里有:
addAssistantToolCalls(...)addToolOutput(toolCallId, output)
这只说明 memory 能把工具交互事实写回会话历史,让后续模型继续看到这段上下文。
它不意味着 ChatMemory 负责:
- 允许不允许调用工具
- 工具是否需要审批
- 工具副作用是否可执行
- 工具失败后怎么补偿
- 多步工具链怎么推进
它记录“发生过什么”,不决定“应该让什么发生”。
3. Tool 层真正负责什么
Core SDK 里,本地工具相关的核心边界在:
ToolUtil@FunctionCall@FunctionRequest@FunctionParameter- 请求侧的
functions - 请求侧的
mcpServices
这部分负责的是:
- 暴露哪些工具能力
- 参数 schema 长什么样
- 调用方把哪些工具挂给模型
- 本地工具和远端 MCP 工具如何被汇总
这和 memory 是邻接关系,不是包含关系。
4. MCP 在这里的角色
MCP 也是能力来源之一,但它的主职责是:
- 建立外部服务连接
- 管理 transport 和 capability
- 暴露可用 tools / resources / prompts
当 MCP 最终把能力暴露给模型时,它会表现得像工具来源;但概念上它仍然属于协议与集成层,而不是 memory 层。
5. 一个对架构很有用的分层法
ChatMemory:保存对话事实Tool:提供本地执行能力MCP:引入外部服务能力
如果某一层开始同时承担“记忆、授权、执行、审批、恢复”,通常说明边界已经糊掉了。
6. 为什么这条边界重要
如果把工具治理责任硬塞进 memory,会马上出现两个问题:
- 会话存储和执行控制耦合,导致 memory 变成隐式运行时
- 业务代码开始依赖 memory 来表达权限、审批或副作用状态,导致抽象扭曲
AI4J 当前把这几层拆开,目的是让:
- 会话历史保持稳定
- 工具选择保持显式
- 外部能力接入保持可替换
7. 什么时候应该升级到上层 runtime
如果你真正关心的是:
- 工具审批
- 多步状态推进
- checkpoint / resume
- 工作区级副作用治理
- 多 agent handoff
那就不该继续把责任压在 ChatMemory 上,而应该进入:
ai4j-agentai4j-coding
8. 这一页的结论
在 AI4J 里,memory 负责保存上下文事实,tool 负责暴露和执行能力,MCP 负责引入外部服务能力。
ChatMemory可以记录工具交互,但它不是工具治理中心;一旦问题开始涉及审批、执行控制或多步运行时语义,就应该上升到更高层 runtime。