概览
Shannon 使用 PostgreSQL 及 pgvector 扩展进行持久化存储。数据库组织为两个模式:auth: 认证、多租户、API 密钥和安全审计日志。public: 核心应用数据,包括任务、会话和使用指标。
实体关系图
模式: auth (认证与多租户)
auth.tenants
用途: 多租户组织管理| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT gen_random_uuid() | 租户标识符 |
| name | VARCHAR(255) | NOT NULL | 组织名称 |
| slug | VARCHAR(100) | UNIQUE, NOT NULL | URL 安全标识符 |
| plan | VARCHAR(50) | DEFAULT ‘free’ | 订阅计划 (free, pro, enterprise) |
| token_limit | INTEGER | DEFAULT 10000 | 每月 token 配额 |
| monthly_token_usage | INTEGER | DEFAULT 0 | 当前月使用量 |
| rate_limit_per_hour | INTEGER | DEFAULT 1000 | API 速率限制 |
| is_active | BOOLEAN | DEFAULT true | 租户状态 |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
| updated_at | TIMESTAMP | DEFAULT NOW() | 最后更新时间 |
| metadata | JSONB | DEFAULT '' | 额外租户数据 |
idx_tenants_slugON (slug)
auth.users
用途: 用户认证和个人资料管理| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT gen_random_uuid() | 用户标识符 |
| VARCHAR(255) | UNIQUE, NOT NULL | 用户邮箱 | |
| username | VARCHAR(100) | UNIQUE, NOT NULL | 用户名 |
| password_hash | VARCHAR(255) | NOT NULL | Bcrypt 密码哈希 |
| full_name | VARCHAR(255) | 全名 | |
| tenant_id | UUID | FK → auth.tenants, NOT NULL | 所属组织 |
| role | VARCHAR(50) | DEFAULT ‘user’ | 角色 (user, admin, owner) |
| is_active | BOOLEAN | DEFAULT true | 账户状态 |
| is_verified | BOOLEAN | DEFAULT false | 邮箱验证状态 |
| email_verified_at | TIMESTAMP | 验证时间戳 | |
| created_at | TIMESTAMP | DEFAULT NOW() | 账户创建时间 |
| updated_at | TIMESTAMP | DEFAULT NOW() | 最后更新时间 |
| last_login | TIMESTAMP | 最后登录时间 | |
| metadata | JSONB | DEFAULT '' | 额外用户数据 |
idx_users_emailON (email)idx_users_usernameON (username)idx_users_tenant_idON (tenant_id)
auth.api_keys
用途: 编程访问的 API 密钥管理| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT gen_random_uuid() | 密钥标识符 |
| key_hash | VARCHAR(255) | UNIQUE, NOT NULL | 密钥的 SHA256 哈希 |
| key_prefix | VARCHAR(20) | NOT NULL | 前 8 个字符(用于显示) |
| user_id | UUID | FK → auth.users | 密钥所有者 |
| tenant_id | UUID | FK → auth.tenants, NOT NULL | 所属组织 |
| name | VARCHAR(100) | NOT NULL | 密钥名称/描述 |
| description | TEXT | 详细描述 | |
| scopes | TEXT[] | DEFAULT […] | 权限数组 |
| rate_limit_per_hour | INTEGER | DEFAULT 1000 | 密钥特定速率限制 |
| last_used | TIMESTAMP | 最后使用时间戳 | |
| expires_at | TIMESTAMP | 过期时间 | |
| is_active | BOOLEAN | DEFAULT true | 密钥状态 |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
| metadata | JSONB | DEFAULT '' | 额外密钥数据 |
idx_api_keys_key_hashON (key_hash)idx_api_keys_user_idON (user_id)
tasks:run: 允许执行任务tasks:read: 允许读取任务状态和结果sessions:manage: 允许管理会话
auth.refresh_tokens
用途: JWT 刷新令牌存储和撤销| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT gen_random_uuid() | 令牌标识符 |
| token_hash | VARCHAR(255) | UNIQUE, NOT NULL | SHA256 哈希 |
| user_id | UUID | FK → auth.users | 令牌所有者 |
| tenant_id | UUID | FK → auth.tenants, NOT NULL | 所属组织 |
| expires_at | TIMESTAMP | NOT NULL | 过期时间 |
| revoked | BOOLEAN | DEFAULT false | 撤销状态 |
| revoked_at | TIMESTAMP | 撤销时间 | |
| ip_address | INET | 客户端 IP | |
| user_agent | TEXT | 客户端 user agent | |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
idx_refresh_tokens_token_hashON (token_hash)idx_refresh_tokens_user_idON (user_id)idx_refresh_tokens_expires_atON (expires_at)
auth.audit_logs
用途: 安全事件审计跟踪| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT gen_random_uuid() | 日志条目 ID |
| event_type | VARCHAR(100) | NOT NULL | 事件类型 |
| user_id | UUID | FK → auth.users | 用户(可为空) |
| tenant_id | UUID | FK → auth.tenants | 租户(可为空) |
| ip_address | INET | 客户端 IP | |
| user_agent | TEXT | 客户端 user agent | |
| details | JSONB | DEFAULT '' | 事件详情 |
| created_at | TIMESTAMP | DEFAULT NOW() | 事件时间 |
idx_audit_logs_event_typeON (event_type)idx_audit_logs_user_idON (user_id)idx_audit_logs_tenant_idON (tenant_id)idx_audit_logs_created_atON (created_at)
login_success: 用户成功登录login_failed: 用户登录失败password_change: 密码已更改api_key_created: API 密钥已创建
模式: public (核心应用)
users
用途: 应用用户配置文件(旧版,关联到 auth.users)| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 用户标识符 |
| external_id | VARCHAR(255) | UNIQUE, NOT NULL | 外部系统 ID |
| VARCHAR(255) | 邮箱地址 | ||
| tenant_id | UUID | 租户引用 | |
| metadata | JSONB | DEFAULT '' | 用户元数据 |
| created_at | TIMESTAMPTZ | DEFAULT NOW() | 创建时间 |
| updated_at | TIMESTAMPTZ | DEFAULT NOW() | 最后更新时间 |
idx_users_tenant_idON (tenant_id)idx_users_external_idON (external_id)
auth.users。
sessions
用途: 用户会话管理和上下文| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 会话标识符 |
| user_id | UUID | FK → users | 会话所有者 |
| tenant_id | UUID | 租户引用 | |
| context | JSONB | DEFAULT '' | 会话上下文数据 |
| token_budget | INTEGER | DEFAULT 10000 | Token 配额 |
| tokens_used | INTEGER | DEFAULT 0 | 已消耗的 token |
| created_at | TIMESTAMPTZ | DEFAULT NOW() | 会话开始时间 |
| updated_at | TIMESTAMPTZ | DEFAULT NOW() | 最后活动时间 |
| expires_at | TIMESTAMPTZ | 过期时间 |
idx_sessions_user_idON (user_id)idx_sessions_tenant_idON (tenant_id)idx_sessions_expires_atON (expires_at)idx_sessions_external_idON ((context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULLidx_sessions_user_external_idUNIQUE ON (user_id, (context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULL AND deleted_at IS NULLidx_sessions_not_deletedON (id) WHERE deleted_at IS NULL
context->>'external_id',用于双 ID 查询。
示例:
task_executions
用途: 任务/工作流执行历史和指标| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 任务标识符 |
| workflow_id | VARCHAR(255) | UNIQUE, NOT NULL | Temporal 工作流 ID |
| user_id | UUID | FK → users | 任务创建者 |
| tenant_id | UUID | 租户引用 | |
| session_id | VARCHAR(255) | 会话标识符 | |
| query | TEXT | NOT NULL | 任务查询/提示 |
| mode | VARCHAR(50) | 执行模式 (SIMPLE, STANDARD, COMPLEX) | |
| status | VARCHAR(50) | NOT NULL | 任务状态 |
| started_at | TIMESTAMPTZ | NOT NULL, DEFAULT NOW() | 开始时间 |
| completed_at | TIMESTAMPTZ | 完成时间 | |
| result | TEXT | 最终结果 | |
| response | JSONB | DEFAULT '' | 结构化响应 |
| error_message | TEXT | 错误详情 | |
| total_tokens | INTEGER | DEFAULT 0 | 使用的总 token 数 |
| prompt_tokens | INTEGER | DEFAULT 0 | 输入 token 数 |
| completion_tokens | INTEGER | DEFAULT 0 | 输出 token 数 |
| total_cost_usd | DECIMAL(10,6) | DEFAULT 0 | 总成本 |
| duration_ms | INTEGER | 执行时间(毫秒) | |
| agents_used | INTEGER | DEFAULT 0 | 使用的代理数量 |
| tools_invoked | INTEGER | DEFAULT 0 | 工具调用次数 |
| cache_hits | INTEGER | DEFAULT 0 | 缓存命中次数 |
| complexity_score | DECIMAL(3,2) | 复杂度 (0.0-1.0) | |
| metadata | JSONB | 额外元数据 | |
| created_at | TIMESTAMPTZ | DEFAULT NOW() | 记录创建时间 |
idx_task_executions_workflow_idON (workflow_id)idx_task_executions_user_idON (user_id)idx_task_executions_session_idON (session_id)idx_task_executions_statusON (status)idx_task_executions_started_atON (started_at)idx_task_executions_tenant_id_started_atON (tenant_id, started_at)
PENDING: 任务已创建但尚未开始RUNNING: 任务正在进行中COMPLETED: 任务成功完成FAILED: 任务失败
agent_executions
用途: 任务中的单个代理执行详情| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 执行 ID |
| task_execution_id | UUID | FK → task_executions | 父任务 |
| agent_id | VARCHAR(255) | NOT NULL | 代理标识符 |
| execution_order | INTEGER | NOT NULL | 执行顺序 |
| input | TEXT | NOT NULL | 代理输入 |
| output | TEXT | 代理输出 | |
| mode | VARCHAR(50) | 执行模式 | |
| state | VARCHAR(50) | FSM 状态 | |
| tokens_used | INTEGER | DEFAULT 0 | 消耗的 token |
| cost_usd | DECIMAL(10,6) | DEFAULT 0 | 执行成本 |
| model_used | VARCHAR(100) | 使用的 LLM 模型 | |
| duration_ms | INTEGER | 执行时间 | |
| memory_used_mb | INTEGER | 内存使用量 | |
| created_at | TIMESTAMPTZ | DEFAULT NOW() | 开始时间 |
| completed_at | TIMESTAMPTZ | 完成时间 |
idx_agent_executions_task_idON (task_execution_id)idx_agent_executions_agent_idON (agent_id)idx_agent_executions_created_atON (created_at)
PLANNING: 代理正在规划其行动EXECUTING_TOOL: 代理正在执行一个工具WAITING_FOR_TOOL: 代理正在等待工具结果THINKING: 代理正在处理信息RESPONDING: 代理正在生成响应ASKING_FOR_HELP: 代理需要人工干预VALIDATING: 代理正在验证其输出COMPLETED: 代理执行完成FAILED: 代理执行失败
tool_executions
用途: 工具调用历史和性能| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 执行 ID |
| agent_execution_id | UUID | FK → agent_executions | 父代理 |
| task_execution_id | UUID | FK → task_executions | 父任务 |
| tool_name | VARCHAR(255) | NOT NULL | 工具标识符 |
| tool_version | VARCHAR(50) | 工具版本 | |
| category | VARCHAR(100) | 工具类别 | |
| input_params | JSONB | 输入参数 | |
| output | JSONB | 工具输出 | |
| success | BOOLEAN | DEFAULT true | 成功状态 |
| error_message | TEXT | 错误详情 | |
| duration_ms | INTEGER | 执行时间 | |
| tokens_consumed | INTEGER | DEFAULT 0 | 使用的 token |
| sandboxed | BOOLEAN | DEFAULT true | 是否使用 WASI 沙箱 |
| memory_used_mb | INTEGER | 内存使用量 | |
| executed_at | TIMESTAMPTZ | DEFAULT NOW() | 执行时间 |
idx_tool_executions_agent_idON (agent_execution_id)idx_tool_executions_task_idON (task_execution_id)idx_tool_executions_tool_nameON (tool_name)idx_tool_executions_executed_atON (executed_at)
DATA_ANALYSIS: 数据分析工具FILE_SYSTEM: 文件系统操作WEB_SEARCH: 网页搜索功能CODE_EXECUTION: 代码执行环境CUSTOM: 用户定义的工具
event_logs
用途: 流式事件存储,用于审计和重放| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 事件 ID |
| workflow_id | VARCHAR(255) | NOT NULL | 工作流标识符 |
| task_id | UUID | 任务引用(可为空) | |
| type | VARCHAR(100) | NOT NULL | 事件类型 |
| agent_id | VARCHAR(255) | 代理标识符 | |
| message | TEXT | 事件消息 | |
| payload | JSONB | DEFAULT '' | 事件有效载荷 |
| timestamp | TIMESTAMPTZ | NOT NULL, DEFAULT NOW() | 事件时间 |
| seq | BIGINT | 序列号 | |
| stream_id | VARCHAR(64) | Redis 流 ID | |
| created_at | TIMESTAMPTZ | NOT NULL, DEFAULT NOW() | 记录创建时间 |
idx_event_logs_workflow_idON (workflow_id)idx_event_logs_task_idON (task_id)idx_event_logs_typeON (type)idx_event_logs_agent_idON (agent_id)idx_event_logs_timestampON (timestamp)idx_event_logs_stream_idON (stream_id)idx_event_logs_payload_ginUSING GIN (payload)
task_startedagent_startedtool_invokedtask_completed
token_usage
用途: 每个任务的详细 token 使用跟踪| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 记录 ID |
| user_id | UUID | FK → users | 用户 |
| task_id | UUID | FK → task_executions | 任务 |
| provider | VARCHAR(50) | NOT NULL | LLM 提供商 |
| model | VARCHAR(255) | NOT NULL | 模型名称 |
| prompt_tokens | INTEGER | NOT NULL | 输入 token |
| completion_tokens | INTEGER | NOT NULL | 输出 token |
| total_tokens | INTEGER | NOT NULL | 总 token |
| cost_usd | DECIMAL(10,6) | NOT NULL | 美元成本 |
| created_at | TIMESTAMPTZ | DEFAULT NOW() | 记录时间 |
idx_token_usage_user_idON (user_id)idx_token_usage_task_idON (task_id)idx_token_usage_provider_modelON (provider, model)idx_token_usage_created_atON (created_at)
usage_daily_aggregates
用途: 预计算的每日使用统计| 列名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | UUID | PK, DEFAULT uuid_generate_v4() | 记录 ID |
| user_id | UUID | FK → users | 用户 |
| date | DATE | NOT NULL | 聚合日期 |
| total_tasks | INTEGER | DEFAULT 0 | 总任务数 |
| successful_tasks | INTEGER | DEFAULT 0 | 成功任务数 |
| failed_tasks | INTEGER | DEFAULT 0 | 失败任务数 |
| total_tokens | INTEGER | DEFAULT 0 | 总 token 数 |
| total_cost_usd | DECIMAL(10,6) | DEFAULT 0 | 总成本 |
| model_usage | JSONB | 模型分布 | |
| tools_invoked | INTEGER | DEFAULT 0 | 工具调用次数 |
| tool_distribution | JSONB | 工具使用分布 | |
| avg_duration_ms | INTEGER | 平均任务持续时间 | |
| cache_hit_rate | DECIMAL(3,2) | 缓存命中百分比 | |
| created_at | TIMESTAMPTZ | DEFAULT NOW() | 记录时间 |
idx_usage_daily_aggregates_user_dateUNIQUE ON (user_id, date)idx_usage_daily_aggregates_dateON (date)
其他表
tool_calls
用途: 旧版工具调用跟踪(请改用 tool_executions)prompts
用途: 提示词版本控制和 A/B 测试learning_cases
用途: 强化学习案例存储session_archives
用途: 来自 Redis 的长期会话快照audit_logs (public)
用途: 应用审计跟踪(与 auth.audit_logs 分开)数据库函数
update_updated_at_column()
用途: 行更改时自动更新updated_at
使用: 作为触发器附加到 users 和 sessions 表
update_daily_aggregate(user_id, date)
用途: 更新或创建用户的每日使用聚合 使用: 任务完成时通过触发器自动调用trigger_update_daily_aggregate()
用途: 在任务状态更改时更新聚合的触发器函数 使用: 在 task_executions INSERT/UPDATE 时自动触发示例查询
任务分析
成本分析
性能监控
最佳实践
1. 索引
始终为以下内容使用索引:- 外键 (
user_id,tenant_id等) - WHERE 子句中使用的高基数列 (
status,mode)。 - 时间序列数据 (
created_at,started_at)。 - 使用 GIN 索引的 JSONB 列。
2. 分区
对于高容量表,考虑分区:3. 数据保留
推荐策略:event_logs: 保留 90 天。task_executions: 保留 1 年,归档旧记录。audit_logs: 保留 2 年。refresh_tokens: 每周清除过期/已撤销的令牌。