Agent 与对话历史
对话历史保存在夜莺服务端,可查看和删除;开源版的「Agent」是内部绑定,不是可以自行创建的对象。
这页上有两件不太相干的事,先说清楚区别:对话历史是天天在用的真功能; 而**「Agent」在开源版里是一个内部绑定,不是你能创建的东西**—— 细节放在下半页,免得你去找一个并不存在的页面。
对话存在哪
每一轮对话都是边发生边落库的,所以刷新页面、换个浏览器、重启 n9e 都不会丢。
两张表装着它:
| 表 | 装什么 |
|---|---|
ai_assistant_chat | 一次对话一行:id、归属用户、标题、最后活跃时间 |
ai_assistant_message | 一轮一行:你的问题、回答,以及背后的工具调用 |
两张表的正文都是压缩存的,实际占用比看聊天记录想象的要小。
对话严格按用户隔离。 每一次读写都会校验请求账号是不是这次对话的主人, 管理员也没有例外,所以别人的对话你看不到——走 API 也一样。
/a2a 上的对话就是同一个对象:调用方回传的 contextId 就是 chat_id,
所以通过 A2A 跟夜莺说话的 Agent,会和这个用户在浏览器里敲的对话
出现在同一个列表里。
一次对话能做什么
Nightingale AI 侧栏的会话区列出你自己的对话,按最近活跃排序, 分成今天 / 昨天 / 更早,上面那个框按标题过滤。鼠标移到某一行会出现一个菜单:
- 重命名——就地改。不改的话标题是根据第一个问题自动生成的, 改过之后就锁住,自动标题不会再覆盖它;
- 分享——复制一个以只读模式打开该对话的链接。服务端每次读取仍然校验归属, 所以这个链接只有你自己打得开;把它当成一个指向只读视图的书签, 而不是把聊天记录交给同事的手段。要给同事看,把文字复制过去。
怎么删
界面上没有删除按钮。 接口是有的,只是界面上没有任何地方去调它。 在这一点改变之前,删除是拿自己的 Token 发一个 API 请求:
curl -s --request DELETE \
-H 'X-User-Token: YOUR_TOKEN' \
http://127.0.0.1:17000/api/n9e/assistant/chat/YOUR_CHAT_ID
chat id 就是对话地址的最后一段。删除会连同它的消息一起删掉, 并且——还是那条归属校验——只删得掉你自己的对话。
没有保留策略,也没有 TTL。 没有任何东西会让对话过期, 所以在用得多的实例上这两张表只会一直涨。在意的话就把上面这个调用脚本化; 它们也就是普通的表,备份和归档流程按常规处理即可。
这里的「Agent」是什么
确实有一张 ai_agent 表,表里一行把一个使用场景绑到一条 LLM 配置和一批 Skill 上。
在开源版里,这件事比听起来小得多:
- 使用场景只有
chat一种,而且只有一行启用的记录会被用到; - 启动时会自动建好一行——
default-chat-agent,不绑定具体模型—— 好让助手开箱即用; - 这一行上没有系统提示词,也没有工具选择。 两者都编译在产品里, Agent 上的任何字段都改不了助手怎么想、能调什么;
- 绑在 chat agent 上的 Skill 在普通对话路径上是被忽略的。 Skill 走的是 「从目录里发现、按需加载」——见安装、管理与编写 Skills;
- 没有菜单入口,没有自己的权限点,而那个确实存在的列表页, 新建按钮已经被去掉了。它仅限管理员,而且只能靠手敲地址进去。
所以:不要在开源版里围绕具名 Agent 搭工作流。 别处的页面或截图把 Agent 管理当成一个功能来讲的话,那不是这个版本。
想改的东西该去哪改
| 你真正想要的 | 去哪做 |
|---|---|
| 换助手用的模型 | 把另一条 LLM 配置设为默认——它本来就压过 Agent 上的绑定(配置大模型提供方) |
| 让某一类问题有不同的行为 | 写一个 Skill,它的描述决定什么时候生效(安装、管理与编写 Skills) |
| 某个流程要更多工具 | 那个 Skill frontmatter 里的 builtin_tools |
| 诊断链要更长 | 那个 Skill frontmatter 里的 max_iterations |
| 限制助手够得着什么 | 提问账号的角色和业务组(权限继承与 RBAC) |
下一步
- 助手拿一次对话做什么:Nightingale AI 概览
- 取代「每个 Agent 一套提示词」的 Skill 机制:安装、管理与编写 Skills
- 从别的 Agent 过来的对话:A2A 端点