16-agent-conversation-architecture.md
6.66 KB
16. Agent 对话架构 — 两层日志 + 多轮上下文恢复
每个 Agent 的对话遵循
conversationId/messageId两层存储架构, 支持持久化 + 多轮上下文 + 服务重启后自动恢复。
16.1 存储结构
data/agents/{agentId}/conversations/ ← Agent 实例自带对话目录
└── {conversationId}/ ← 一个对话
├── meta.json ← 对话元数据
├── history.json ← 有序消息列表 (供前端 + 上下文恢复)
└── {messageId}/ ← 一轮对话 (user + agent)
└── messages.log ← 时间戳日志
meta.json 结构
{
"conversationId": "conv-mn3112l3",
"agentId": "innovator-001",
"title": "创建 Master Agent",
"createdAt": "2026-03-23T10:12:11.993Z",
"updatedAt": "2026-03-23T10:12:50.078Z",
"status": "completed", // running | completed | failed | idle
"stats": {
"messageCount": 4,
"toolCallCount": 2
}
}
history.json 结构
[
{ "role": "user", "content": "你好", "messageId": "msg-xxx-aaa", "timestamp": "..." },
{ "role": "assistant", "content": "你好,我是 Innovator", "messageId": "msg-xxx-aaa", "timestamp": "..." },
{ "role": "user", "content": "帮我创建 Master Agent", "messageId": "msg-xxx-bbb", "timestamp": "..." },
{ "role": "assistant", "content": "好的,我来创建...", "messageId": "msg-xxx-bbb", "timestamp": "..." }
]
messages.log 格式 (每轮)
[2026-03-23T10:12:11.994Z] [USER]
你好
[2026-03-23T10:12:26.207Z] [AGENT]
你好,我是 Innovator,LemonBoss 的元 Agent。
16.2 多轮对话 — 三场景自动处理
┌─────────────────────────────────────┐
│ sendMessage() │
│ Agent.js 父类核心接口 │
└────────────┬────────────────────────┘
│
┌────────────▼────────────────────────┐
│ isNewSession = false? │
│ (同进程 + 同 conversationId) │
└───┬──────────────────────────┬──────┘
│ YES │ NO
▼ ▼
┌───────────────┐ ┌───────────────────────┐
│ 场景 B: │ │ history.length === 0? │
│ 直接发 message│ └───┬───────────────┬──-┘
│ (ACP 自带上下文) │ YES │ NO
└───────────────┘ ▼ ▼
┌──────────────┐ ┌──────────────────┐
│ 场景 A: │ │ 场景 C: │
│ system prompt │ │ system prompt │
│ + 用户消息 │ │ + 历史摘要 (≤20条) │
│ │ │ + 用户消息 │
└──────────────┘ └──────────────────┘
| 场景 | 触发条件 | Prompt 构成 | 说明 |
|---|---|---|---|
| A. 全新对话 | 首条消息 + 无历史 | systemPrompt + message | ClaudeCliProtocol 首次 sendPrompt |
| B. 同进程多轮 | 同 convId + same session | message only | ACP 持久进程天然保持上下文 |
| C. 恢复对话 | 新 session + 有历史 | systemPrompt + history + message | 服务重启后自动注入历史摘要 |
16.3 ACP Session 池
sessions: Map<key, entry>
key = "{agentId}:{conversationId}" ← 每个对话独立会话
entry = {
protocol: ClaudeCliProtocol, ← 持久 CLI 进程
messageCount: number, ← 消息计数 (判断首次 vs 后续)
agentId: string,
convId: string,
}
- 一个 Agent 可以同时有多个对话(不同 conversationId)
- 每个对话对应一个独立的 ClaudeCliProtocol 实例
- 进程退出 / 超时 → 自动清理 → 下次 sendMessage 时自动创建新会话 + 恢复上下文
16.4 Agent.js 父类接口
packages/agent-core/Agent.js 提供以下对话管理方法:
| 方法 | 说明 |
|---|---|
createConversation(title) |
创建新对话,返回 { conversationId } |
listConversations() |
列出所有对话的 meta 信息 |
loadConversationHistory(convId) |
加载对话的完整消息列表 |
appendMessage(convId, msg) |
追加消息(同步写 messageId 日志 + history.json + meta.json) |
sendMessage(convId, message, options) |
核心接口:自动处理三场景 prompt 构建,emit event 给 ACP 层 |
16.5 API 端点
GET /api/agent/list → 列出所有 Agent
GET /api/agent/:agentId/info → Agent 详情
GET /api/agent/:agentId/conversations → 对话列表
GET /api/agent/:agentId/conversations/:convId → 对话详情 (meta + messages)
POST /api/agent/:agentId/chat → 发送消息 (SSE 流式响应)
body: { message, conversationId? }
events: session | thinking | agent_output | tool_call | error | result
DELETE /api/agent/:agentId/conversations/:convId → 删除对话
16.6 与 Agent 目录结构的关系
data/agents/{id}/
├── agent.md
├── soul.md
├── identity.md
├── user.md
├── tools.md
├── heartbeat.md
├── skills/
├── memory/
├── knowledge/
├── workspace/
+ ├── conversations/ ← 新增: 对话会话目录
+ │ └── {convId}/
+ │ ├── meta.json
+ │ ├── history.json
+ │ └── {msgId}/
+ │ └── messages.log
├── logs/
└── config.json
对话是 Agent 的一部分,而不是全局的——每个 Agent 管理自己的对话历史。