
最近折腾了 Hot Dev 框架,顺手做了一个带记忆功能的 AI 聊天机器人 demo,踩了几个"记忆作用域"的坑,这篇把问题说清楚。
Hot Chat 是一个 Web 聊天示例,用大概 15 分钟就能跑起来。它同时跑了两个 AI 智能体:一个个人模式(Personal Mode)智能体,记忆跟着用户走;一个团队模式(Team Mode)智能体,记忆跟着频道走。
UI 层用的是 Next.js + TypeScript,通过 @hot-dev/sdk(软件开发工具包)连接 Hot 后端。智能体层构建在 hot.dev/hot-ai-agent 之上,这是一个可复用的 Hot 包,封装了传输层、命令解析、运行时存储、渲染、流式响应和 MCP(模型上下文协议)辅助工具。Hot Dev 本身是 Apache 2.0 开源的,所以这篇文章里涉及的代码你都能直接阅读。
跑 demo 之前,如果没有安装 hot CLI,先 安装 Hot。
git clone https://github.com/hot-dev/hot-demos
cd hot-demos/hot-chat
hot dev --open # terminal 1: both agents
cp .env.example .env # terminal 2: the UI
# Hot App -> API Keys -> New Key; paste it into HOT_API_KEY.
# Then add your ANTHROPIC_API_KEY (https://console.anthropic.com/) to .env.
npm install && npm run dev
打开 http://localhost:3000。工具栏可以随时切换两个智能体,不需要重启。
在 .env 里设置好 ANTHROPIC_API_KEY 才能看到真实的、带记忆的流式回复。没有这个 key,UI 也能加载,但助手回复会退化成一个简单提示"LLM 已禁用"的桩函数。整个 harness 基于 hot-ai 构建,所以在自己的应用里可以换成其他 LLM 提供商。
完整教程看 hot.dev/docs/demos/hot-chat。
Hot Chat 在一个 Hot 项目里跑两个智能体。表面上它们几乎一样:同样的聊天 UI,同样的斜杠命令,同样的流式回复。
区别在于记忆的作用域划分方式。
个人模式是身份优先。不管你在哪个会话、哪个标签页、哪台设备上聊天,告诉智能体的内容都跟随着你自己。输入 /remember 我更喜欢从阻断项开始的发布更新,关掉标签页,明天换台设备登录,问 /recall,同样的记录还在。
这种模式适合个人助手、日志应用、用户级别的 Copilot,以及记忆属于人而非会话的场景。
团队模式是会话优先。记忆以频道为作用域,两个人在同一个房间里聊天会共享同一个记忆视图,而两个频道之间保持独立。输入"我们决定先发文档再上线",再输入"CI 是唯一的阻断项",然后 /ask 现在有什么在阻断上线?,智能体会引用匹配的记录并标注来源。
这种模式适合团队聊天机器人、客服收件箱和共享工作空间。
| 概念 | 团队模式 | 个人模式 |
|---|---|---|
| 会话 | 频道或线程 | 每人一个临时上下文 |
| 身份 | 发帖的人 | 持久记忆的所有者 |
| 记忆 | 作用域在会话 | 作用域在用户 |
Hot Chat 聊天中。工具栏可以随时在个人模式和团队模式之间切换。
Hot Chat 的 UI 是刻意做得很通用的。它看起来像个正经聊天产品,而不是框架演示。因为体验本身就是重点:
notes.md 文件或截图。智能体把文件名和类型存为元数据,可以扩展为解析文件内容。session_id 和 user_id,格式和 Slack 或 Telegram 适配器生成的一样。每个命令一个事件处理器,没有中心调度。
hot-ai-agent Brings如果你之前搭过 AI 聊天智能体,大概写过这几块东西:
大多数聊天智能体都在重复造这些轮子。
hot-ai-agent 把这一层抽象出来。具体来说,它提供:
IncomingMessage 结构,Web、Slack、Telegram 或其他适配器都可以翻译成这个格式。智能体代码里永远不需要针对传输类型做分支判断。/ask@MyBot what's up? 解析成 {name: "ask", arg: "what's up?"},同时把 Telegram 风格的 @MyBot 后缀剥离掉。recall -> persist user -> bind request -> stream -> persist assistant 生命周期封装在一个函数调用里。顺序很重要;如果搞反了,用户的新消息可能会污染他自己的检索结果。<agent>:reply:start、:delta 和 :end 事件,标签名稳定且作用域明确。它刻意不包含的东西:传输层的第三方包。没有内置 Slack、Telegram 或 Discord 的包。这些都在应用层,翻译成中性类型后传给智能体,这样 harness 就能保持可移植,依赖树也比较小。
当所有 harness 组件都就位之后,Hot 里的整个聊天风格事件处理器长这样:
remember-message
meta { agent: PersonalAgent, on-event: "personal-agent:remember",
}
fn (event) { d event.data sender identity-from-data(d) session session-from-data(d, sender) input base-input(d, session, sender, Str(or(d.text, ""))) ::chat-turn/run-chat-turn(turn-cfg, input)
}
就这么长。解析出是谁在说话,组装输入,然后交给 run-chat-turn。
RAG(检索增强生成)、持久化、顺序控制、流式响应、请求绑定、工具调度和错误处理全都在这一行调用背后。
在自己的智能体里加一个新的斜杠命令也是同样的模式:再加一个函数,再加一个 on-event 注解。
把 Hot Chat clone 下来,试着自己换 LLM 提供商、加斜杠命令,或者在同一个智能体上接第二个适配器。以下所有内容都是开源的,随便读。
hot-ai-agent 包: hot.dev/pkg/hot.dev/hot-ai-agenthot-ai 包: hot.dev/pkg/hot.dev/hot-ai@hot-dev/sdk(JS/TS): npmjs.com/package/@hot-dev/sdk原文链接:https://dev.to/hotdotdev/build-ai-agents-with-personal-and-team-memory-in-hot-dev-5fne