news 2026/9/16 20:25:00

Open Agents 数据库设计:Drizzle + Postgres 的 15 张表完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Open Agents 数据库设计:Drizzle + Postgres 的 15 张表完全指南

Open Agents 数据库设计:Drizzle + Postgres 的 15 张表完全指南

【免费下载链接】open-agentsAn open source template for building cloud agents.项目地址: https://gitcode.com/GitHub_Trending/op/open-agents

Open Agents 是一个构建云端编程 Agent 的开源模板,其后端基于Drizzle ORM + PostgreSQL构建。本文带你完整解析它的15 张数据表设计——从用户认证到会话、聊天、沙箱生命周期与用量统计,帮你快速理解这套 AI Agent 云平台的数据库架构,以及如何在自己的项目中复用这套设计思路。

为什么选择 Drizzle + Postgres?

Open Agents 的数据库层非常精简,核心只有三个部分:

组成部分文件路径作用
表结构定义apps/web/lib/db/schema.ts用 TypeScript 声明式定义 15 张表
数据库连接apps/web/lib/db/client.ts基于postgres驱动的懒加载连接
迁移管理apps/web/lib/db/migrations/37 个版本化的 SQL 迁移文件

相比传统 SQL 文件维护表结构,Drizzle 的优势在于:

  • 类型安全:每张表通过$inferSelect/$inferInsert自动推导 TypeScript 类型,写查询时 IDE 直接提示字段
  • 声明式迁移:改一次schema.tsdrizzle-kit自动生成带编号的 SQL 迁移文件,历史可追溯
  • 配置极简:整个连接配置见 drizzle.config.ts,只需一个POSTGRES_URL环境变量

💡 数据库连接采用 Proxy 懒加载模式(client.ts),首次访问时才建立连接,避免服务启动时的冷启动开销。

15 张表全景图:四大模块分组

15 张表按业务职责可以分为四组,这也是阅读 schema.ts 源码的最佳顺序:

一、认证模块(4 张表):Open Agents 用户登录体系

#表名一句话说明
1users用户主表:username、邮箱、头像、is_admin等基础信息
2accountsOAuth 第三方账号:GitHub/Vercel 的 access_token、refresh_token
3auth_sessions会话凭据:token 全局唯一,记录 IP 与 User-Agent
4verification验证令牌:邮箱验证等一次性验证码,带过期时间

这张表是整库的"根",其余表全部通过外键references(() => users.id)关联它,并统一使用onDelete: "cascade"级联删除——用户注销后,其所有会话、聊天、用量数据自动清理,无需写清理脚本。

二、平台集成模块(2 张表):连接 GitHub 与 Vercel

#表名一句话说明
5github_installationsGitHub App 安装记录,区分 User / Organization 账户类型
6vercel_project_links仓库与 Vercel 项目的映射关系,支持团队级部署

这两个表体现了云端 Agent 的核心定位:它不只是一个聊天机器人,而是一个能直接操作你代码仓库和部署平台的系统

  • github_installations上有两个唯一索引(用户+安装 ID、用户+账户 login),保证同一账户不会重复记录
  • vercel_project_links(user_id, repo_owner, repo_name)复合主键,一个仓库对应一个项目,天然防重

三、核心业务模块(5 张表):Session → Chat → Message 三级结构

这是 Open Agents 数据模型的心脏:

users (1) ──< sessions (1) ──< chats (1) ──< chat_messages │ │ │ ├──< chat_reads(已读状态) │ └──< shares(分享链接) └──< workflow_runs ──< workflow_run_steps
#表名一句话说明
7sessions核心大表:一个编程会话 = 一个仓库 + 一条分支 + 一个沙箱
8chats会话内的多个对话轮次,记录当前使用的模型与活跃流
9shares聊天只读分享链接,chat_id唯一索引保证一会话一链接
10chat_messages消息本体,parts用 JSONB 存储完整的文本/工具调用部件
11chat_reads用户已读标记,(user_id, chat_id)复合主键
重点拆解:sessions 表的"沙箱生命周期"设计

sessions表(schema.ts#L126-L201)字段最多,是理解整个项目的关键。它同时承载了四类信息:

  1. 仓库定位repo_owner/repo_name/branch/clone_url,其中is_new_branch标记是否自动创建了新分支
  2. 沙箱状态sandbox_state(JSONB)+lifecycle_state枚举(provisioning / active / hibernating / hibernated / restoring / archived / failed),配合lifecycle_version做乐观锁,防止并发状态覆盖
  3. 休眠调度hibernate_after/sandbox_expires_at/last_activity_at三个时间戳,支撑"空闲自动休眠、唤醒自动恢复"的快照机制
  4. 成果追踪pr_number/pr_status(open/merged/closed)、lines_added/lines_removed,让会话列表直接展示产出统计

这种"生命周期状态机落库"的做法,配合 SANDBOX-LIFECYCLE.md 文档描述的编排流程,是 Agent 类应用保证任务可恢复性的关键——即使服务器重启,进程也能从数据库状态续跑。

重点拆解:消息为何用 JSONB 存储 parts?

chat_messages表刻意把消息内容整体存进partsJSONB 字段(schema.ts#L233-L244),而不拆成"文本表 + 工具调用表"。原因是 AI 消息结构多变(文本、推理、工具调用、审批按钮混杂),JSONB 提供了"灵活存储 + 可索引查询"的平衡点,避免了为每种消息类型加表。

四、运行与用量模块(4 张表):Agent 执行的"黑匣子"

#表名一句话说明
12workflow_runs每次 Agent 运行的完整记录:状态、起止时间、总耗时
13workflow_run_steps运行的每一步:步号、耗时、结束原因,(run_id, step_number)唯一
14user_preferences用户偏好:默认模型、自动提交、自动建 PR、通知提醒等
15usage_events用量流水(append-only):每轮对话的 token 数与工具调用次数

这组设计有两个亮点:

  • Workflow 双层记录workflow_runs+workflow_run_steps把一次 Agent 执行拆成"运行-步骤"两级,每步都记录耗时和结束原因。这正是 Open Agents"持久化工作流"架构的落地——Agent 不依赖单次 HTTP 请求生命周期,断了可以从最后一步恢复
  • 用量表只增不改usage_events按"每条助手回复一行"追加写入,按用户/模型/Agent 类型(主 Agent / 子 Agent)分维度记录 token。它是排行榜(usage-domain-leaderboard.ts)和用量洞察(usage-insights.ts)的数据底座,append-only 模式天然适合聚合分析

索引与外键:三个值得抄的设计细节

1. 高频查询路径都有索引

sessionsuser_idchatssession_idworkflow_runschat_id / session_id / user_id建索引——恰好对应"我的会话列表""会话内聊天""某次运行记录"三条最热查询路径。

2. 级联删除贯穿全库

几乎所有外键都是onDelete: "cascade":删用户 → 删会话 → 删聊天 → 删消息/运行记录,数据一致性靠数据库而非应用代码保证。

3. 迁移自愈机制

启动时的迁移脚本(migrate.ts)不仅执行 SQL,还能检测"有表结构但没有迁移历史"的遗留数据库,跳过已存在的对象并补录迁移记录(migrate.ts#L109-L152),对 fork 后直接跑的场景非常友好。

快速上手:如何运行这套数据库

  1. 准备 Postgres 连接串,填入POSTGRES_URL环境变量
  2. 参考 [apps/web/.env.example] 补齐其他密钥(Neon 可自动提供 Postgres)
  3. 部署时自动执行 migrate.ts 完成建表,无需手动跑 SQL

总结:这套设计的可复用经验

Open Agents 的 15 张表给出了一个 AI Agent 产品的完整数据模型参考:

设计点借鉴价值
Session/Chat/Message 三级分层长任务应用的通用结构,沙箱状态挂在 Session 层
生命周期状态机 + 版本号乐观锁保证后台任务可恢复、不并发覆盖
消息内容用 JSONB灵活应对 AI 消息结构多变的问题
运行/步骤双层流水表Agent 执行的审计与性能分析基础
级联删除 + 追加型用量表数据清理靠约束,分析靠流水

如果你想在自己的项目中实践 Drizzle + Postgres,建议从 apps/web/lib/db/schema.ts 入手通读一遍表定义,再结合 migrations 目录 中 37 个迁移文件,观察这套 schema 是如何一步步演化而来的——这本身就是一份免费的数据库演进教科书。

【免费下载链接】open-agentsAn open source template for building cloud agents.项目地址: https://gitcode.com/GitHub_Trending/op/open-agents

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 20:23:31

Ubuntu开机卡BusyBox?initramfs修复指南:从UUID到GRUB

1. 开机停在BusyBox提示符时&#xff0c;系统到底想告诉你什么很多第一次碰到这段画面的人&#xff0c;都会被屏幕上的(initramfs)提示符吓住。我最早是在一台台式机加装第二块硬盘之后撞上的&#xff0c;屏幕停在BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (…

作者头像 李华
网站建设 2026/9/16 20:23:24

深度学习文本分类算法源码实战:数据加载、模型训练与推理全解析

简介&#xff1a;面向文本分类任务&#xff0c;这份基于深度学习模型的算法源码包提供了完整可运行的工程实现&#xff0c;尤其聚焦BERT类模型的预训练与微调环节&#xff0c;适合计算机、数学、电子信息等专业学生用于课程设计、期末大作业或毕设项目&#xff0c;也是新手快速…

作者头像 李华
网站建设 2026/9/16 20:22:45

2ASK误码率仿真与MATLAB GUI设计:从理论到工程实战

简介&#xff1a;一份基于MATLAB图形界面的2ASK调制解调误码率仿真源码&#xff0c;面向通信工程专业学生、课程设计者及需要快速验证数字调制方案的开发人员&#xff0c;重点解决2ASK系统在噪声信道下误码率性能的分析与可视化问题。压缩包共包含2个文件&#xff0c;其中M源码…

作者头像 李华
网站建设 2026/9/16 20:22:30

STM32C542中TIM15硬件输入捕获测频原理与工业级实践

1. 为什么用TIM15测频率&#xff0c;而不是更“热门”的TIM1或TIM2&#xff1f;在STM32生态里&#xff0c;一提输入捕获测频率&#xff0c;很多人第一反应是翻出《STM32F4xx参考手册》第18章&#xff0c;盯着TIM1、TIM2那密密麻麻的寄存器框图发呆——毕竟它们功能最全、资料最…

作者头像 李华