# Agent 与对话历史

对话历史保存在夜莺服务端，可查看和删除；开源版的「Agent」是内部绑定，不是可以自行创建的对象。

最后校对于 2026-10-10

这页上有两件不太相干的事，先说清楚区别：**对话历史是天天在用的真功能**； 而\*\*「Agent」在开源版里是一个内部绑定，不是你能创建的东西\*\*—— 细节放在下半页，免得你去找一个并不存在的页面。

## 对话存在哪[​](#对话存在哪 "对话存在哪的直接链接")

每一轮对话都是边发生边落库的，所以刷新页面、换个浏览器、重启 `n9e` 都不会丢。 两张表装着它：

| 表                     | 装什么                                         |
| ---------------------- | ---------------------------------------------- |
| `ai_assistant_chat`    | 一次对话一行：id、归属用户、标题、最后活跃时间 |
| `ai_assistant_message` | 一轮一行：你的问题、回答，以及背后的工具调用   |

两张表的正文都是压缩存的，实际占用比看聊天记录想象的要小。

**对话严格按用户隔离。** 每一次读写都会校验请求账号是不是这次对话的主人， 管理员也没有例外，所以别人的对话你看不到——走 API 也一样。

`/a2a` 上的对话就是同一个对象：调用方回传的 `contextId` 就是 `chat_id`， 所以通过 [A2A](https://n9e.github.io/zh/docs/ai/a2a.md) 跟夜莺说话的 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」是什么[​](#这里的agent是什么 "这里的「Agent」是什么的直接链接")

确实有一张 `ai_agent` 表，表里一行把一个**使用场景**绑到一条 LLM 配置和一批 Skill 上。 在开源版里，这件事比听起来小得多：

* **使用场景只有 `chat` 一种**，而且只有一行启用的记录会被用到；
* **启动时会自动建好一行**——`default-chat-agent`，不绑定具体模型—— 好让助手开箱即用；
* **这一行上没有系统提示词，也没有工具选择。** 两者都编译在产品里， Agent 上的任何字段都改不了助手怎么想、能调什么；
* **绑在 chat agent 上的 Skill 在普通对话路径上是被忽略的。** Skill 走的是 「从目录里发现、按需加载」——见[安装、管理与编写 Skills](https://n9e.github.io/zh/docs/ai/skills.md)；
* **没有菜单入口**，没有自己的权限点，而那个确实存在的列表页， 新建按钮已经被去掉了。它仅限管理员，而且只能靠手敲地址进去。

所以：不要在开源版里围绕具名 Agent 搭工作流。 别处的页面或截图把 Agent 管理当成一个功能来讲的话，那不是这个版本。

## 想改的东西该去哪改[​](#想改的东西该去哪改 "想改的东西该去哪改的直接链接")

| 你真正想要的             | 去哪做                                                                                                                             |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- |
| 换助手用的模型           | 把另一条 LLM 配置设为**默认**——它本来就压过 Agent 上的绑定（[配置大模型提供方](https://n9e.github.io/zh/docs/ai/llm-provider.md)） |
| 让某一类问题有不同的行为 | 写一个 Skill，它的描述决定什么时候生效（[安装、管理与编写 Skills](https://n9e.github.io/zh/docs/ai/skills.md)）                    |
| 某个流程要更多工具       | 那个 Skill frontmatter 里的 `builtin_tools`                                                                                        |
| 诊断链要更长             | 那个 Skill frontmatter 里的 `max_iterations`                                                                                       |
| 限制助手够得着什么       | 提问账号的角色和业务组（[权限继承与 RBAC](https://n9e.github.io/zh/docs/ai/permissions.md)）                                       |

## 下一步[​](#下一步 "下一步的直接链接")

* 助手拿一次对话做什么：[Nightingale AI 概览](https://n9e.github.io/zh/docs/ai/nightingale-ai.md)
* 取代「每个 Agent 一套提示词」的 Skill 机制：[安装、管理与编写 Skills](https://n9e.github.io/zh/docs/ai/skills.md)
* 从别的 Agent 过来的对话：[A2A 端点](https://n9e.github.io/zh/docs/ai/a2a.md)
