Postgres 架构,总结。每个保存租户数据的表都有一个
workspace_id 列(直接或通过 agent_id
传递),相应的模型使用 BelongsToWorkspace 或
BelongsToAgent。
身份
| 表 | 说明 |
users | 邮箱 + 密码(bcrypt)。2FA 字段。role:customer 或 super_admin(PlatformRole 枚举)。default_workspace_id 用于切换器固定。 |
workspaces | 名称 + Stripe 客户/订阅 ID + plan_id。app_settings 风格的覆盖存储在 settings JSON 列中。 |
workspace_users | 枢轴。(user_id, workspace_id, role),其中 role 是 owner/admin/member。 |
invitations | 邮箱 + 角色 + 令牌 + 7 天过期。属于工作区。 |
智能体及其配置
| 表 | 说明 |
agents | Persona、主题、system_prompt、guardrails、starter_prompts、allowed_origins、confidence_threshold、language_default、auto_index_visited_pages、is_published、published_version_id。 |
agent_versions | 每次发布时创建的不可变快照。运行时从这些读取,而不是从 agent 行读取。 |
behavior_rules | (agent_id, kind, conditions JSON, action JSON, enabled, priority)。 |
cta_rules | 用于可点击号召性用语的专用行为规则。 |
curated_answers | (agent_id, triggers[], answer_md, citation_url)。 |
experiments | 行为规则的 A/B 配置。 |
知识
| 表 | 说明 |
sources | (agent_id, type, status, config JSON, last_synced_at, error)。type:url/sitemap/feed/text/notion/google_doc/auto。 |
documents | (source_id, url, title, content, lang)。每个爬取的页面或粘贴的文本一个。 |
chunks | (document_id, idx, content, token_count)。嵌入的单位。 |
integration_connections | (workspace_id, provider, encrypted_token, scope)。Notion、Google Drive、Slack。 |
Chunk 嵌入仅存在于向量存储中
(Vectorize / Qdrant)— Postgres chunks 表保存
文本 + 元数据,而不是向量。元数据作为标签镜像在向量点上,
以便检索可以按 agent_id 过滤。
对话和消息
| 表 | 说明 |
visitors | (agent_id, anonymous_id, ip_hash, ua, first_seen_at, last_seen_at, visit_count)。anon_id 将小部件重新加载连接到同一行。 |
conversations | (agent_id, visitor_id, page_url, started_at, lang, claimed_by_user_id, claimed_at, cleared_at, is_playground)。 |
messages | (conversation_id, role, content, citations JSON, latency_ms, created_at)。角色:user / assistant / human-agent。 |
leads | (agent_id, conversation_id, name, email, phone, fields JSON)。在 (agent_id, email) 上唯一以去重。 |
content_gaps | (agent_id, sample_question, occurrence_count, sample_conversations[])。当标记低置信度时由 DetectGapJob 创建。 |
账单
| 表 | 说明 |
plans | (name, slug, monthly_conversations, price_cents, features JSON, is_active, stripe_product_id, stripe_price_id)。 |
plan_subscriptions | Cashier 订阅镜像。(workspace_id, stripe_subscription_id, stripe_status, ends_at)。 |
usage_events | (workspace_id, kind, quantity, occurred_at)。按月聚合用于配额门控。 |
app_settings | 单例行。Stripe / 邮件 / 品牌覆盖 + 不在 env 中的 LLM / 向量 / 爬虫配置。每个秘密的加密转换。 |
操作
| 表 | 说明 |
audit_logs | (actor_id, workspace_id, action, target_type, target_id, metadata, created_at)。每个特权操作。 |
jobs / failed_jobs | 标准 Laravel 队列表。failed_jobs 驱动 /admin/jobs/failed。 |
notifications | 标准 Laravel 通知。 |
重要的索引
conversations(agent_id, visitor_id, started_at desc) — 访客恢复查找每次 init 都运行。
messages(conversation_id, created_at) — 聊天历史加载。
chunks(document_id) — 源删除时快速删除。
usage_events(workspace_id, occurred_at) — 配额门控。
leads(agent_id, email) — 去重约束,唯一。
workspace_users(user_id, workspace_id) — 唯一枢轴。
静态加密
敏感列使用 Laravel 的 encrypted 转换:集成
OAuth 令牌、app_settings 中的 Stripe 秘密、邮件
密码、自定义 LLM API 密钥。加密密钥是标准的
APP_KEY — 像备份数据库一样备份它。
软删除
大多数表在级联时硬删除。例外情况:
plans — 永不破坏性删除(来自工作区的 FK,来自发票的 FK)。通过 is_active 软删除。
invitations — 过期后由每日清理作业清除。