# PicoBot 数据库表结构 数据库为 SQLite,默认位于 workspace 下的 `picobot.db`。 连接启用 WAL、`synchronous=NORMAL`、foreign keys、5 秒 busy timeout,连接池最多 8 个连接。当前 `PRAGMA user_version=1`;启动时会在事务内补齐旧库字段和索引,遇到比程序更新的 schema version 会拒绝启动。 ## sessions 表 会话表,一个 session 对应一个 (channel, chat_id, dialog_id) 组合。 | 字段 | 类型 | 说明 | |------|------|------| | `id` | TEXT PK | session ID,格式 `::` | | `channel` | TEXT | 渠道名称 | | `chat_id` | TEXT | 聊天/群组标识 | | `dialog_id` | TEXT | 对话标识 | | `title` | TEXT | 会话标题(默认 "新对话") | | `created_at` | INTEGER | 创建时间(Unix 毫秒) | | `last_active_at` | INTEGER | 最后活跃时间(Unix 毫秒) | | `message_count` | INTEGER | 消息计数 | | `routing_info` | TEXT | 路由信息 | | `archived_at` | INTEGER | 归档时间(Unix 毫秒),NULL 表示未归档 | | `deleted_at` | INTEGER | 软删除时间戳 | | `last_consolidated_at` | INTEGER | 上次记忆归并时间 | | `last_compressed_message_at` | INTEGER | 上次上下文压缩边界时间戳 | `(channel, chat_id, dialog_id)` 唯一。普通列表排除 `deleted_at`;是否包含归档记录由查询参数决定。 ## messages 表 | 字段 | 类型 | 说明 | |------|------|------| | `id` | TEXT PK | 消息 UUID | | `session_id` | TEXT FK | 所属会话,外键关联 sessions(id) | | `seq` | INTEGER | 消息序号 | | `role` | TEXT | 角色: user / assistant / tool / system | | `content` | TEXT | 消息内容 | | `media_refs` | TEXT | 多媒体引用 JSON | | `tool_call_id` | TEXT | 工具调用 ID | | `tool_name` | TEXT | 工具名称 | | `tool_calls` | TEXT | 工具调用参数 JSON | | `source` | TEXT | 消息来源(跨会话消息时标记来源 session_id) | | `created_at` | INTEGER | 创建时间(Unix 毫秒) | | `reasoning_content` | TEXT | provider 返回的推理内容(如有) | `(session_id, seq)` 有唯一索引,防止并发写入重复序号。删除 session 会通过外键级联删除 messages。 ## background_tasks 表 delegate 后台子任务表。`session_id` 不使用数据库外键,因为 session 使用软删除,关联关系由应用层维护。 | 字段 | 类型 | 说明 | |------|------|------| | `id` | TEXT PK | 后台任务 ID | | `session_id` | TEXT | 所属会话 | | `channel` | TEXT | 回传渠道 | | `chat_id` | TEXT | 回传目标对话 | | `prompt` | TEXT | 子任务提示 | | `allowed_tools` | TEXT | 允许工具 JSON | | `status` | TEXT | pending / running / completed / failed / cancelled | | `result` | TEXT | 执行结果 | | `error` | TEXT | 错误信息 | | `tool_calls_count` | INTEGER | 工具调用次数 | | `iterations` | INTEGER | Agent 迭代次数 | | `started_at` | INTEGER | 开始时间 | | `finished_at` | INTEGER | 结束时间 | | `created_at` | INTEGER | 创建时间 | ## memories 表 长期记忆存储。 | 字段 | 类型 | 说明 | |------|------|------| | `id` | TEXT PK | 记忆 UUID | | `key` | TEXT UNIQUE | 记忆唯一键 | | `content` | TEXT | 记忆内容 | | `category` | TEXT | 类别: knowledge / timeline | | `importance` | REAL | 重要性权重 (0-1) | | `session_id` | TEXT | 关联会话 | | `created_at` | TEXT | 创建时间 | | `updated_at` | TEXT | 更新时间 | 配套 FTS5 全文索引虚拟表 `memory_fts(key, content)`,用于关键词搜索,通过触发器自动同步。 ## scheduled_jobs 表 | 字段 | 类型 | 说明 | |------|------|------| | `id` | TEXT PK | 任务 UUID | | `name` | TEXT | 任务名称 | | `schedule` | TEXT | 调度规则 JSON(at/every/cron) | | `prompt` | TEXT | 任务提示词 | | `channel` | TEXT | 执行渠道 | | `chat_id` | TEXT | 目标对话 | | `model` | TEXT | 可选模型标记;当前会存储/展示,但 Scheduler 执行仍使用默认 Agent 模型 | | `enabled` | INTEGER | 是否启用 (1/0) | | `delete_after_run` | INTEGER | 执行后自动删除 (1/0) | | `next_run_at` | INTEGER | 下次执行时间 | | `last_run_at` | INTEGER | 上次执行时间 | | `last_status` | TEXT | 上次执行状态 | | `last_error` | TEXT | 上次错误信息 | | `locked_at` | INTEGER | 本次领取时间 | | `lock_owner` | TEXT | 领取任务的 Scheduler owner UUID | | `lease_until` | INTEGER | 租约到期时间;进程崩溃后允许其他实例重新领取 | | `created_at` | INTEGER | 创建时间(Unix 毫秒) | | `updated_at` | INTEGER | 更新时间(Unix 毫秒) | Scheduler 使用原子 `UPDATE ... RETURNING` 领取到期任务。任务结果、下次运行时间和租约释放在同一事务中提交,并校验 owner,防止过期 worker 覆盖已恢复的任务。 ## job_runs 表 | 字段 | 类型 | 说明 | |------|------|------| | `id` | INTEGER PK | 自增 ID | | `job_id` | TEXT FK | 关联任务,外键关联 scheduled_jobs(id) | | `started_at` | INTEGER | 开始时间 | | `finished_at` | INTEGER | 结束时间 | | `status` | TEXT | 执行状态 | | `output` | TEXT | 执行输出 | | `error` | TEXT | 错误信息 | | `duration_ms` | INTEGER | 耗时(毫秒) | ## llm_calls 表 记录所有 LLM API 调用的请求/响应详情,自动保留最近 1000 条。 | 字段 | 类型 | 说明 | |------|------|------| | `id` | INTEGER PK | 自增 ID | | `created_at` | INTEGER | 调用时间 | | `provider` | TEXT | 提供商类型 | | `model` | TEXT | 模型名称 | | `request_body` | TEXT | 请求体 JSON | | `response_body` | TEXT | 响应体 JSON | | `error` | TEXT | 错误信息 | | `duration_ms` | INTEGER | 耗时(毫秒) | `request_body`/`response_body` 可能包含用户内容,排障和导出数据库时应按敏感数据处理。