12 KiB
title, source, author, published, created, description, tags
| title | source | author | published | created | description | tags |
|---|---|---|---|---|---|---|
| AgentBase 项目需求文档 | shenwei |
AgentBase 项目需求文档
文档版本: v1.0 创建日期: 2026-04-05 状态: 待确认 负责人: 星枢(协调)、星匠(实施) 项目位置:
~/Workspace/agentbase/
1. 项目概述
1.1 项目背景
OpenClaw 多 Agent 系统运行于 Mac Mini + Ubuntu1 + Ubuntu2 三节点,每日产生大量 session JSONL 文件。这些文件记录了 Agent 的完整对话历史、思考过程(thinking block)、工具调用(toolCall)等核心数据,目前以原始文件形式散落各服务器,无法高效查询。
1.2 项目目标
构建一套 session 解析与归档系统,将多节点、多 Agent 的 JSONL 会话数据统一解析入库,通过 Django Admin 提供可查询、可筛选、可追溯的 Web 管理界面。
1.3 核心价值
- 可审计:任何 Agent 的任何操作记录可追溯
- 可分析:按 Agent/时间/工具类型等多维度分析 Agent 行为模式
- 可优化:基于真实调用数据优化 Agent 工作流
2. 系统范围
2.1 纳入系统
| 服务器 | 角色 | Session 根目录 |
|---|---|---|
Mac Mini (macmini) |
中央控制节点 | /Users/weishen/.openclaw/agents/ |
Ubuntu1 (ubuntu1) |
准生产服务器 | /home/shenwei/.openclaw/agents/ |
Ubuntu2 (ubuntu2) |
开发服务器 | /home/shenwei/.openclaw/agents/ |
2.2 纳入 Agent
main / xingyao / xinghui / xingjiang / opencode / sisyphus
2.3 纳入文件类型
| 文件类型 | 说明 | session_type |
|---|---|---|
*.jsonl |
正常 session | normal |
*.jsonl.reset.* |
reset 快照 | reset |
*.jsonl.deleted.* |
删除快照 | deleted |
*-topic-*.jsonl |
线程 session | topic |
忽略文件: sessions.json(索引文件,不解析)
2.4 不纳入范围
- 实时流式解析(仅定时批量解析)
- Session 内容编辑(只读归档)
- 跨 Agent 关联分析(v1)
- 移动端界面
3. 功能需求
3.1 增量解析引擎
FR-PARSE-001:扫描指定服务器 + Agent 的 session 目录,列出所有符合类型的 .jsonl 文件
FR-PARSE-002:对每个文件,基于「文件路径 + mtime + size」判断是否需要重新解析(增量控制)
FR-PARSE-003:解析 JSONL 中的 type:session 记录,提取 session 元信息
FR-PARSE-004:解析 JSONL 中的 type:message 记录,提取消息内容、toolCall、thinking 等
FR-PARSE-005:对于 type:message,正确提取并拆分以下 content block 类型:
text→ 纯文本内容thinking→ 思考过程文本toolCall→ 工具调用(id/name/arguments)toolResult→ 工具结果(toolCallId/content/isError)
FR-PARSE-006:从 message 元数据中提取 AI Provider / Model / API / Token 计数 / Cost 等计量数据
FR-PARSE-007:解析完成后更新 parsed_files 表(status: success / failed + error_message)
3.2 数据库存储
FR-DB-001:维护 parsed_files 表,记录每个已解析文件的元数据及状态(增量控制)
FR-DB-002:维护 sessions 表,记录每个 session 的根信息(去重依据:session_uuid + server + agent_id)
FR-DB-003:维护 messages 表,记录每条消息的完整信息(content 原文、提取字段、计量数据)
FR-DB-004:对 messages 表建立合理索引,支持按 agent_id + timestamp / first_tool_call / session_id 等常用查询模式
3.3 Django Admin 管理界面
FR-ADMIN-001:Messages 列表页
- 支持按
agent_id过滤 - 支持按
timestamp范围过滤 - 支持按
role(user/assistant/toolResult)过滤 - 支持按
first_tool_call过滤 - 列表显示:id / message_uuid / role / text_preview(前100字符) / has_thinking / first_tool_call / timestamp
FR-ADMIN-002:Messages 详情页
- 显示
content_blocks原始 JSON(完整展开) - 显示
thinking_text(独立字段) - 显示
tool_calls_json(完整展开) - 显示所有计量字段(tokens / cost)
FR-ADMIN-003:Sessions 列表页
- 支持按
server/agent_id/session_type过滤 - 列表显示:id / session_uuid / server / agent_id / session_type / started_at / message_count
FR-ADMIN-004:ParsedFiles 列表页
- 支持按
server/agent_id/status过滤 - 列表显示:id / server / agent_id / file_path / file_mtime / status / parsed_at
- 支持按
file_path搜索
3.4 定时任务
FR-CRON-001:每日定时(建议 00:05)自动执行解析任务,覆盖所有服务器、所有 Agent
FR-CRON-002:解析任务通过 OpenClaw cron 触发,调用 scripts/parse_and_import.py
3.5 命令行接口
FR-CLI-001:支持按服务器 + Agent 指定解析范围
python parse_and_import.py --server macmini --agent xingyao
FR-CLI-002:支持 --dry-run 参数,仅扫描文件不写入数据库
FR-CLI-003:支持 --force 参数,强制重新解析(忽略增量状态)
4. 非功能需求
4.1 性能
NFR-PERF-001:单次解析 10,000 条消息应在 60 秒内完成
NFR-PERF-002:Django Admin 列表页加载时间不超过 3 秒(百万级数据量下)
NFR-PERF-003:JSONL 文件逐行解析,不一次性加载到内存(流式处理)
4.2 可靠性
NFR-RELI-001:解析失败的文件需记录 error_message,不影响同批次其他文件
NFR-RELI-002:数据库操作使用事务保证一致性(单文件解析失败回滚)
NFR-RELI-003:重复解析同一文件(mtime+size 未变)应被跳过,不重复写入
4.3 可维护性
NFR-MAIN-001:数据库 schema 变更通过 Django Migration 管理
NFR-MAIN-002:配置信息(数据库连接)集中写在 settings.py,不散落多处
4.4 安全性
NFR-SEC-001:数据库凭据不硬编码在代码中,通过环境变量或 Django settings 管理
NFR-SEC-002:Django Admin 仅本地访问(暂不开放远程)
5. 数据库 Schema(摘要)
5.1 parsed_files
| 字段 | 类型 | 约束 |
|---|---|---|
| id | INT AUTO_INCREMENT | PK |
| server | VARCHAR(32) | NOT NULL |
| agent_id | VARCHAR(64) | NOT NULL |
| file_path | VARCHAR(512) | NOT NULL |
| file_mtime | BIGINT | NOT NULL |
| file_size | BIGINT | NOT NULL |
| status | VARCHAR(16) | NOT NULL |
| parsed_at | DATETIME | |
| error_message | TEXT | NULL |
UNIQUE:(server, agent_id, file_path)
5.2 sessions
| 字段 | 类型 | 约束 |
|---|---|---|
| id | INT AUTO_INCREMENT | PK |
| server | VARCHAR(32) | NOT NULL |
| agent_id | VARCHAR(64) | NOT NULL |
| session_uuid | VARCHAR(64) | NOT NULL |
| file_path | VARCHAR(512) | |
| session_type | VARCHAR(32) | |
| cwd | VARCHAR(512) | |
| started_at | DATETIME(3) | |
| first_message_at | DATETIME(3) | |
| last_message_at | DATETIME(3) | |
| message_count | INT | DEFAULT 0 |
UNIQUE:(session_uuid, server, agent_id)
5.3 messages
| 字段 | 类型 | 约束 |
|---|---|---|
| id | INT AUTO_INCREMENT | PK |
| session_id | INT | FK → sessions.id |
| server | VARCHAR(32) | NOT NULL |
| agent_id | VARCHAR(64) | NOT NULL |
| session_uuid | VARCHAR(64) | NOT NULL |
| message_uuid | VARCHAR(64) | NOT NULL |
| parent_message_uuid | VARCHAR(64) | NULL |
| role | VARCHAR(32) | NOT NULL |
| content_blocks | JSON | 原文 |
| text_preview | VARCHAR(512) | 摘要 |
| first_tool_call | VARCHAR(128) | NULL |
| tool_call_count | INT | DEFAULT 0 |
| tool_calls_json | JSON | 拆出 |
| thinking_text | TEXT | NULL |
| has_thinking | TINYINT | DEFAULT 0 |
| has_tool_calls | TINYINT | DEFAULT 0 |
| is_error | TINYINT | DEFAULT 0 |
| provider | VARCHAR(64) | |
| model | VARCHAR(128) | |
| api | VARCHAR(64) | |
| stop_reason | VARCHAR(64) | |
| input_tokens | INT | |
| output_tokens | INT | |
| cache_read_tokens | BIGINT | |
| cache_write_tokens | BIGINT | |
| total_tokens | INT | |
| cost_usd | DECIMAL(12,8) | |
| timestamp | DATETIME(3) |
INDEX:idx_agent_timestamp(agent_id, timestamp) / idx_first_tool_call(first_tool_call) / idx_session_id(session_id) / idx_role(role)
6. 用户故事
US-001:查询某 Agent 某天的完整对话
作为管理员,我想查看「星曜 2026-04-05 所有消息」,以便审计当天的操作记录
验收标准:
- 在 Messages 列表页输入 agent_id = xingyao + date range = 2026-04-05
- 返回结果按 timestamp 升序排列
- 每条结果显示 text_preview / has_thinking / first_tool_call
US-002:查看某条消息的完整思考过程
作为管理员,我想查看某条消息的 thinking_text 和 toolCalls 详情,以便分析 Agent 的决策逻辑
验收标准:
- 点击任意消息进入详情页
- thinking_text 字段完整展示(无截断)
- tool_calls_json 以可读 JSON 格式展示
US-003:查询某天某 Agent 执行过的所有 exec 命令
作为管理员,我想查看「星曜今天执行了哪些 exec 命令」,以便审计系统操作
验收标准:
- 过滤器 first_tool_call = exec + agent_id = xingyao + date range
- 返回结果包含每条 exec 的 text_preview(截取前512字符)
US-004:追踪已解析文件状态
作为管理员,我想查看哪些 session 文件已成功解析、哪些失败,以便监控数据入库情况
验收标准:
- ParsedFiles 列表页显示所有文件的解析状态
- 失败条目显示 error_message
- 可按 server / agent_id / status 过滤
US-005:增量同步最新 session
作为系统,我需要在每日定时任务中自动解析新增的 session 文件,不重复解析已入库且未变化的文件
验收标准:
- 同一文件 mtime+size 未变时,parsed_files 中 status=success 的记录被识别为「已解析」
- 新增文件或变化文件被正确解析入库
7. 技术选型
| 组件 | 选型 | 说明 |
|---|---|---|
| Web 框架 | Django 4.x | 成熟稳定,Admin 功能强大 |
| 数据库 | MariaDB | 与 NAS/现有基础设施兼容 |
| Python 版本 | 3.10+ | OpenClaw 生态兼容 |
| 部署位置 | Mac Mini | 与 OpenClaw 同节点,SSH 访问 ubuntu1/2 |
| ORM | Django ORM | 与 Django 深度集成 |
| 定时任务 | OpenClaw cron | 与现有任务系统统一 |
8. 项目目录结构
~/Workspace/agentbase/ # Git 仓库
├── manage.py
├── agentbase/ # Django 项目
│ ├── __init__.py
│ ├── settings.py # 数据库配置
│ ├── urls.py
│ └── wsgi.py
├── messages/ # Django App
│ ├── __init__.py
│ ├── models.py # 三张表
│ ├── admin.py # Admin 配置
│ ├── views.py # Web 视图
│ ├── urls.py
│ ├── management/
│ │ └── commands/
│ │ └── parse_sessions.py
│ └── templates/
│ └── messages/
├── scripts/
│ └── parse_and_import.py # CLI 入口脚本
├── tests/
├── requirements.txt
└── README.md
9. 后续步骤(待用户确认后执行)
- 确认数据库部署位置(Mac Mini 本地 MariaDB?NAS?其他?)
- 确认数据库名称
- 创建 Git 仓库
- 初始化 Django 项目
- 实施解析引擎
- 配置 Django Admin
- 编写定时任务
- 编写测试
- 部署上线
10. 附录:典型查询参考
-- US-001:查某 Agent 某天所有消息
SELECT id, message_uuid, role, text_preview, has_thinking, first_tool_call, timestamp
FROM messages
WHERE agent_id = 'xingyao'
AND timestamp BETWEEN '2026-04-05 00:00:00' AND '2026-04-05 23:59:59'
ORDER BY timestamp;
-- US-003:查某 Agent 某天所有 exec 调用
SELECT m.id, m.timestamp, m.text_preview, m.session_uuid
FROM messages m
WHERE m.agent_id = 'xingyao'
AND m.timestamp BETWEEN '2026-04-05 00:00:00' AND '2026-04-05 23:59:59'
AND m.first_tool_call = 'exec';
本文档由星枢整理,基于 2026-04-05 与比利哥的讨论