Doramagic 项目包 · 项目说明书

statewave 项目

生成时间:2026-05-14 12:54:51 UTC

Statewave 简介

Statewave 是一个专为 AI Agent 设计的记忆管理系统,帮助 Agent 从真实世界的各种数据源中构建、检索和利用持久化记忆。通过提供 Episode(事件片段)摄取、Memory(记忆片段)编译、上下文组装等功能,Statewave 使 Agent 能够在多轮对话和工作流程中保持一致性和连续性。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Subject(主体)

继续阅读本节完整说明和来源证据。

章节 Episode(事件片段)

继续阅读本节完整说明和来源证据。

章节 Memory(记忆片段)

继续阅读本节完整说明和来源证据。

资料来源:README.md:1-20

核心概念

Statewave 的数据模型围绕以下核心实体构建:

graph TD
    A[Subject 主体] --> B[Episode 事件片段]
    A --> C[Memory 记忆片段]
    B --> D[Compilation 编译]
    C --> E[Context 上下文]
    F[Resolution 解决方案] --> A
    G[Snapshot 快照] --> A

Subject(主体)

Subject 是最高层级的数据容器,代表一个特定的实体(如客户、项目、用户或任何需要记忆的抽象概念)。每个 Subject 拥有独立的 Episode 和 Memory 存储空间。

资料来源:server/starter_packs/statewave-support-agent/manifest.json:8

Episode(事件片段)

Episode 是 Statewave 中的基础数据单元,代表一次不可变的事件或交互记录。Episode 可以来源于:

  • 实时对话转录
  • GitHub Issues、Pull Requests
  • 文档变更
  • Slack 消息
  • MCP Server 事件
  • 任何自定义数据源

每个 Episode 包含标题、正文内容、元数据以及来源信息,通过 content_hash 实现内容去重和增量更新。

资料来源:scripts/docs_loader.py:30-50

Memory(记忆片段)

Memory 是经过编译(Compile)后的结构化记忆。编译过程从多个 Episode 中提取关键信息,生成包含以下属性的记忆单元:

属性说明
kind记忆类型(如决策、偏好、问题等)
content记忆内容
summary摘要信息
confidence置信度
valid_from有效起始时间
valid_to有效结束时间(可选)
source_episode_ids来源 Episode ID 列表

资料来源:server/api/admin.py:50-80

Resolution(解决方案)

Resolution 用于跟踪会话级别的解决方案状态,支持 SLA 指标计算和响应时间追踪。

资料来源:server/api/timeline.py:60-90

Snapshot(快照)

Snapshot 提供 Subject 的完整状态快照功能,包含 Episodes、Memories 和 Resolutions 的时间点副本,支持数据恢复和迁移场景。

资料来源:server/services/snapshots.py:20-80

系统架构

Statewave 采用现代化的微服务架构设计,主要组件包括:

graph TD
    subgraph 客户端层
        A[Agent 应用]
        B[Connectors]
        C[SDK]
    end
    
    subgraph API 网关层
        D[FastAPI Server<br/>:8100]
        E[OpenAPI / Swagger]
    end
    
    subgraph 业务逻辑层
        F[Episode Service]
        G[Memory Service]
        H[Context Service]
        I[Timeline Service]
    end
    
    subgraph 数据层
        J[(PostgreSQL)]
        K[(Embedding Store)]
    end
    
    subgraph 外部服务
        L[LiteLLM]
        M[LLM Provider]
    end
    
    A --> D
    B --> D
    C --> D
    D --> F
    D --> G
    D --> H
    D --> I
    F --> J
    G --> J
    G --> K
    H --> L
    I --> J
    L --> M

技术栈

层级技术选型
API 框架FastAPI
数据库PostgreSQL + asyncpg
LLM 集成LiteLLM
向量嵌入可配置(默认 LiteLLM)
部署方式Docker / Kubernetes Helm

资料来源:README.md:50-70

API 参考

健康检查端点

端点用途
GET /healthzGET /health存活探针
GET /readyzGET /ready就绪探针

Episode 管理

方法路径描述
POST/v1/episodes摄取单个 Episode(追加模式)
POST/v1/episodes/batch批量摄取最多 100 个 Episode

资料来源:README.md:30-45

Memory 管理

方法路径描述
POST/v1/memories/compile编译 Memories(幂等操作)
GET/v1/memories/search按类型、文本或语义相似度搜索

Context 上下文组装

方法路径描述
POST/v1/context组装基于排序和 Token 限制的上下文包

Subject 主体管理

方法路径描述
GET/v1/subjects列出已知主体及 Episode/Memory 计数
DELETE/v1/subjects/{id}永久删除主体的所有数据
GET/v1/subjects/{id}/health客户健康评分及可解释因素
GET/v1/subjects/{id}/slaSLA 指标(响应时间、解决时间、违反情况)

时间线与解决方案

方法路径描述
GET/v1/timeline按时间顺序排列的主体时间线
POST/v1/resolutions跟踪每个会话的解决方案状态
GET/v1/resolutions列出主体的解决方案
POST/v1/handoff生成紧凑的交接上下文包

资料来源:README.md:35-55

编译模式

Statewave 支持两种编译模式:

LLM 编译(默认)

使用大型语言模型从 Episode 中提取结构化 Memory,提供更高的语义理解能力。需要配置 LLM API Key。

启发式编译

基于规则的编译模式,适用于演示环境或无 LLM 场景,性能更快但语义理解能力有限。

配置方式:STATEWAVE_COMPILER_TYPE=heuristic

资料来源:helm/statewave/README.md:25-30

连接器生态

Statewave 提供了丰富的连接器(Connector)生态系统,用于从不同数据源摄取 Episode:

数据源功能状态
MCP ServerCopilot/Claude/Cursor/Agent 记忆同步✅ 已发布
GitHubIssues、PRs、Reviews、Releases → Repo 记忆✅ 已发布
Markdown本地文档、ADR、RFC → 决策记忆✅ 已发布
Slack频道消息同步✅ 已发布
n8n工作流事件集成✅ 已发布
ZapierZapier 自动化集成✅ 已发布

安装方式(按需选择):

npm install @statewavedev/connectors-github
npm install @statewavedev/connectors-markdown
npm install @statewavedev/connectors-slack
npm install @statewavedev/connectors-n8n
npm install @statewavedev/connectors-zapier
npm install @statewavedev/mcp-server

资料来源:README.md:80-110

配置参考

环境变量配置

变量默认值说明
STATEWAVE_DATABASE_URLPostgreSQL 连接字符串(必填)
STATEWAVE_LITELLM_API_KEYLiteLLM API Key(LLM/嵌入必需)
STATEWAVE_LITELLM_BASE_URLLiteLLM 自定义基础 URL
STATEWAVE_EMBEDDING_PROVIDERlitellm嵌入提供商
STATEWAVE_COMPILER_TYPEllmllmheuristic
STATEWAVE_API_KEYAPI 认证密钥
STATEWAVE_RATE_LIMIT0每分钟/IP 请求限制(0=禁用)
STATEWAVE_RATE_LIMIT_STRATEGYdistributeddistributed(Postgres)或 memory
STATEWAVE_WEBHOOK_URLWebhook 回调 URL
STATEWAVE_TENANT_HEADERX-Tenant-ID多租户隔离 Header
STATEWAVE_REQUIRE_TENANTfalse是否强制要求租户 Header
STATEWAVE_DEFAULT_MAX_CONTEXT_TOKENS4000上下文组装默认 Token 预算
STATEWAVE_CORS_ORIGINS["*"]允许的 CORS 来源列表

资料来源:README.md:100-120

部署方式

Docker Compose 部署

services:
  statewave:
    image: statewavedev/statewave:latest
    ports: ["8100:8100"]
    environment:
      STATEWAVE_DATABASE_URL: postgresql+asyncpg://statewave:statewave@db:5432/statewave
      STATEWAVE_LITELLM_API_KEY: sk-...
    depends_on:
      db:
        condition: service_healthy

volumes:
  pgdata:
docker compose up -d
curl http://localhost:8100/healthz

指定版本部署:

STATEWAVE_VERSION=0.7.0 docker compose up -d

Kubernetes Helm 部署

helm install statewave ./helm/statewave \
  --set database.url='postgresql+asyncpg://...' \
  --set llm.apiKey='sk-...'

Helm 安装时会自动运行数据库迁移(Alembic)Job,确保在 API Pod 接收流量前完成 schema 初始化。

资料来源:DOCKER.md:1-50 资料来源:helm/statewave/README.md:1-30

Docker 镜像标签

标签含义
latestmain 分支最新代码
X.Y.Z语义化版本发布
X.Y该 minor 版本的最新版本
X该 major 版本的最新版本
sha-<7>特定 Commit

资料来源:DOCKER.md:30-40

启动包

Statewave 提供了开箱即用的 Starter Pack,其中包含预置的 Episodes 和 Memories:

statewave-support-agent

预编译的支持代理启动包,包含 276 个 Episodes 和 364 个 Memories,涵盖:

  • 产品文档
  • 架构设计
  • 部署指南
  • 故障排除
  • 竞品对比

版本:1.2026.05.08

导入后可立即启用文档驱动的支持代理,无需额外引导步骤。

资料来源:server/starter_packs/statewave-support-agent/manifest.json:1-20

当前限制

Statewave 目前处于活跃开发阶段(v0.8.0),存在以下已知限制:

速率限制

  • 速率限制按 IP 级别:使用分布式(Postgres 后端)实现,但仅按 IP 键控,尚未支持按租户或 API Key 级别限制

多租户

  • 多租户隔离在应用层:通过查询作用域数据隔离(v0.5)+ 每租户配置/策略/收据包(v0.8)实现
  • 尚未支持 PostgreSQL RLS(行级安全策略)

资料来源:README.md:130-140

测试

运行测试

# 单元测试(无需数据库)
pytest tests/test_*.py -v

# 集成测试(需要 PostgreSQL)
PGPASSWORD=statewave createdb -h localhost -U statewave statewave_test
pytest tests/integration/ -v

# 全部测试
pytest tests/ -v

资料来源:README.md:120-130

相关资源

  • 官方文档:https://statewave.ai
  • 仓库地址:https://github.com/smaramwbc/statewave
  • 连接器生态:https://github.com/smaramwbc/statewave-connectors
  • API 契约文档:https://github.com/smaramwbc/statewave-docs/blob/main/api/v1-contract.md

资料来源:[README.md:1-20]()

快速开始

本页面提供 Statewave 的快速部署和基本使用指南,帮助你在本地环境快速启动服务并验证核心功能。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 1. 克隆仓库

继续阅读本节完整说明和来源证据。

章节 2. 配置环境变量

继续阅读本节完整说明和来源证据。

章节 3. 启动服务

继续阅读本节完整说明和来源证据。

系统要求

组件最低要求推荐配置
Docker20.10+最新稳定版
Docker Compose2.0+v2.x
PostgreSQL14+15+
内存4GB8GB+
CPU2核4核+

资料来源:docker-compose.yml:1-50

快速启动(Docker Compose)

1. 克隆仓库

git clone https://github.com/smaramwbc/statewave.git
cd statewave

2. 配置环境变量

Statewave 通过环境变量进行配置。在项目根目录创建 .env 文件:

cp .env.example .env

基础配置项:

环境变量默认值说明
STATEWAVE_DATABASE_URLPostgreSQL 连接字符串,必填
STATEWAVE_LITELLM_API_KEYLLM API 密钥(用于编译功能)
STATEWAVE_API_KEYAPI 访问密钥
STATEWAVE_PORT8100服务监听端口
STATEWAVE_RATE_LIMIT_PER_MIN60每IP每分钟请求限制

资料来源:.env.example

3. 启动服务

# docker-compose.yml 核心配置
services:
  app:
    image: statewavedev/statewave:latest
    ports:
      - "8100:8100"
    environment:
      STATEWAVE_DATABASE_URL: postgresql+asyncpg://statewave:statewave@db:5432/statewave
      STATEWAVE_LITELLM_API_KEY: sk-...
    depends_on:
      db:
        condition: service_healthy

volumes:
  pgdata:
docker compose up -d

资料来源:DOCKER.md:1-20

4. 验证服务

服务启动后,通过健康检查端点验证:

curl http://localhost:8100/healthz

预期响应:{"status":"ok"}

端点用途
GET /healthzGET /health存活检查
GET /readyzGET /ready就绪检查

资料来源:README.md:50-55

服务架构

graph TD
    A[客户端] --> B[Statewave API<br/>:8100]
    B --> C[PostgreSQL<br/>Database]
    B --> D[LLM Provider<br/>LiteLLM]
    B --> E[Embedding Provider]
    
    F[Connectors] --> B
    G[SDK] --> B
    
    style B fill:#e1f5fe
    style C fill:#f3e5f5

API 基础使用

文档界面

地址说明
http://localhost:8100/docsOpenAPI (Swagger) 文档
http://localhost:8100/redocReDoc 文档

核心 API 端点

方法路径说明
POST/v1/episodes摄入单个事件(仅追加)
POST/v1/episodes/batch批量摄入最多 100 个事件
POST/v1/memories/compile从事件编译记忆(幂等)
GET/v1/memories/search按类型、文本或语义相似度搜索
POST/v1/context组装带 token 限制的上下文包
GET/v1/timeline按时间线查看主题历史
GET/v1/subjects列出已知主题及其事件/记忆计数
DELETE/v1/subjects/{id}永久删除主题的所有数据

资料来源:README.md:40-45

基本请求示例

摄入事件:

curl -X POST http://localhost:8100/v1/episodes \
  -H "Content-Type: application/json" \
  -H "X-Tenant-ID: default" \
  -d '{
    "subject_id": "user-123",
    "source": "api",
    "type": "conversation",
    "payload": {
      "role": "user",
      "content": "如何部署 Statewave?"
    },
    "session_id": "session-001"
  }'

搜索记忆:

curl "http://localhost:8100/v1/memories/search?query=部署" \
  -H "X-Tenant-ID: default"

版本管理

Statewave 支持指定版本部署:

STATEWAVE_VERSION=0.7.0 docker compose up -d
标签格式含义
latestmain 分支最新代码
X.Y.Z语义化版本发布
X.Y所属小版本的最新版本
X所属大版本的最新版本
sha-<7>特定提交

资料来源:DOCKER.md:25-35

运行测试

# 单元测试(无需数据库)
pytest tests/test_*.py -v

# 集成测试(需要 PostgreSQL)
PGPASSWORD=statewave createdb -h localhost -U statewave statewave_test
pytest tests/integration/ -v

# 运行全部测试
pytest tests/ -v

资料来源:README.md:180-190

完整配置选项

环境变量默认值说明
STATEWAVE_DATABASE_URLPostgreSQL 连接 URL,必填
STATEWAVE_PORT8100服务端口
STATEWAVE_API_KEYAPI 密钥认证
STATEWAVE_LITELLM_API_KEYLiteLLM API 密钥
STATEWAVE_LITELLM_BASE_URLLiteLLM 基础 URL
STATEWAVE_EMBEDDING_PROVIDERlitellm嵌入提供者(litellm/stub)
STATEWAVE_COMPILER_TYPEllm编译器类型(llm/heuristic)
STATEWAVE_RATE_LIMIT_PER_MIN60每IP每分钟请求限制(0=禁用)
STATEWAVE_RATE_LIMIT_STRATEGYdistributed限流策略(distributed/memory)
STATEWAVE_WEBHOOK_URLWebhook 回调 URL
STATEWAVE_WEBHOOK_TIMEOUT5.0Webhook 超时时间(秒)
STATEWAVE_TENANT_HEADERX-Tenant-ID多租户隔离 Header
STATEWAVE_REQUIRE_TENANTfalse是否强制要求租户 Header
STATEWAVE_DEFAULT_MAX_CONTEXT_TOKENS4000上下文组装默认 token 预算
STATEWAVE_CORS_ORIGINS["*"]允许的 CORS 来源

资料来源:README.md:155-175

下一步

资料来源:[docker-compose.yml:1-50]()

系统架构概览

Statewave 是一个自托管的长期记忆管理系统,专为 AI Agent 设计,旨在帮助 Agents 跨越会话边界保持上下文连贯性。该系统通过摄取事件片段(Episodes)、编译记忆(Memories)、并提供智能检索上下文构建能力,使 AI Agent 能够在多轮对话中持续学习和适应。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 5.1 主要端点

继续阅读本节完整说明和来源证据。

章节 5.2 健康检查端点

继续阅读本节完整说明和来源证据。

章节 6.1 核心实体关系

继续阅读本节完整说明和来源证据。

1. 概述

Statewave 是一个自托管的长期记忆管理系统,专为 AI Agent 设计,旨在帮助 Agents 跨越会话边界保持上下文连贯性。该系统通过摄取事件片段(Episodes)、编译记忆(Memories)、并提供智能检索上下文构建能力,使 AI Agent 能够在多轮对话中持续学习和适应。

当前版本:v0.8.0,采用 AGPL-3.0 开源协议。资料来源:README.md

2. 核心设计理念

Statewave 的架构围绕三个核心概念展开:

概念说明
Episode(事件片段)原子化的输入单元,代表一次交互、一条消息或一个外部事件
Memory(记忆)从 Episodes 编译提取的结构化知识,具有时间有效性和置信度
Subject(主体)记忆归属的实体(如客户、用户、项目),实现数据隔离

系统支持两种编译模式:LLM 编译(语义理解)和 Heuristic 编译(规则提取)。资料来源:server/services/compilers/heuristic.py

3. 系统架构图

graph TB
    subgraph 接入层
        API[REST API v1]
        DOCS[OpenAPI / Swagger]
        REDOC[ReDoc]
    end

    subgraph 应用层
        EP[Episode 管理]
        MEM[Memory 管理]
        CTX[Context 构建]
        TIMELINE[Timeline 服务]
        SNAP[Snapshot 服务]
        ADMIN[Admin API]
    end

    subgraph 服务层
        COMPILER[编译引擎]
        RANKER[排名服务]
        SEARCH[搜索服务]
    end

    subgraph 数据层
        DB[(PostgreSQL)]
        CACHE[缓存层]
    end

    API --> EP
    API --> MEM
    API --> CTX
    API --> TIMELINE
    API --> SNAP
    API --> ADMIN

    EP --> COMPILER
    MEM --> RANKER
    CTX --> RANKER
    CTX --> SEARCH

    COMPILER --> DB
    RANKER --> DB
    SEARCH --> DB
    TIMELINE --> DB
    SNAP --> DB

4. 技术栈

层级技术选型
Web 框架FastAPI
数据库PostgreSQL + asyncpg
ORMSQLAlchemy (async)
编译后端LiteLLM (支持多种 LLM 提供商)
部署方式Docker Compose / Helm
认证API Key / X-Tenant-ID 多租户隔离

资料来源:DOCKER.md

5. API 架构

5.1 主要端点

方法路径描述
POST/v1/episodes摄入单个事件片段
POST/v1/episodes/batch批量摄入事件片段(最多100个)
POST/v1/memories/compile编译记忆(幂等操作)
GET/v1/memories/search按类型、文本或语义相似度搜索
POST/v1/context组装带排名的 token 受限上下文包
GET/v1/timeline主体时间线
GET/v1/subjects列出已知主体及事件/记忆计数
DELETE/v1/subjects/{id}删除主体所有数据
POST/v1/resolutions跟踪会话解决状态
GET/v1/resolutions列出主体解决方案
POST/v1/handoff生成紧凑的交接上下文包
GET/v1/subjects/{id}/health健康评分及可解释因素
GET/v1/subjects/{id}/slaSLA 指标

资料来源:README.md

5.2 健康检查端点

端点用途
GET /healthzGET /health存活探针
GET /readyzGET /ready就绪探针

6. 数据模型

6.1 核心实体关系

erDiagram
    SUBJECT ||--o{ EPISODE : contains
    SUBJECT ||--o{ MEMORY : owns
    EPISODE ||--o{ MEMORY : contributes_to
    SUBJECT ||--o{ RESOLUTION : tracks
    SUBJECT ||--o| SNAPSHOT : preserves

6.2 Episode 数据结构

事件片段是系统的原子输入单元,包含:

{
    "id": "uuid",
    "subject_id": "string",
    "source": "string",           # 来源标识 (e.g., "api", "github", "slack")
    "type": "string",            # 类型 (e.g., "chat", "issue", "doc_section")
    "payload": {
        "text": "string",
        "messages": [...],
        "event_time": "datetime"  # 可选的显式时间戳
    },
    "metadata": {},
    "provenance": {
        "content_hash": "string",
        "pack_version": "int"
    },
    "occurred_at": "datetime",
    "created_at": "datetime",
    "session_id": "string | null"
}

资料来源:server/api/timeline.py

6.3 Memory 数据结构

记忆从事件编译而来,具有时间有效性和置信度:

字段类型说明
idUUID唯一标识
subject_idstring归属主体
kindstring记忆类型(如 episode_summary, profile_fact)
contentstring记忆内容
summarystring内容摘要
confidencefloat置信度 0.0-1.0
valid_fromdatetime有效起始时间
valid_todatetime有效结束时间(可选)
source_episode_idslist[UUID]来源事件片段
statusstring状态(active, superseded)
sensitivity_labelslist[string]敏感标签

资料来源:server/services/snapshots.py

7. 服务层架构

7.1 编译引擎

编译引擎负责将 Episodes 转换为 Memories,支持两种模式:

graph LR
    A[Episodes] --> B{编译模式}
    B -->|Heuristic| C[规则提取]
    B -->|LLM| D[语义理解]
    C --> E[Memories]
    D --> E

Heuristic 编译:基于规则提取摘要和配置事实

  • episode_summary:从文本提取摘要,置信度 0.8
  • profile_fact:提取配置类事实,置信度 0.6

资料来源:server/services/compilers/heuristic.py

7.2 上下文构建服务

上下文构建服务(Context Service)负责根据查询组装最优上下文:

graph TB
    Q[用户查询] --> S[搜索相关Memories和Episodes]
    S --> SC[评分计算]
    SC --> R[相关性评分]
    R --> RANK[排名服务]
    RANK --> TB[Token预算约束]
    TB --> CTX[组装上下文包]

Context Service 内部使用 _ScoredItem 类管理评分:

class _ScoredItem:
    __slots__ = ("score", "kind", "memory_row", "episode_row", "text", "section")

资料来源:server/services/context.py

7.3 快照服务

快照服务支持主体的完整备份和恢复:

操作说明
创建快照导出主体的所有 Episodes、Memories、Resolutions
恢复快照支持时间偏移重放,可重建历史状态
增量更新保留 restored_from_snapshot 元数据

资料来源:server/services/snapshots.py

8. 时间线服务

时间线服务(Timeline Service)提供会话视图的事件合并展示:

graph TB
    subgraph 事件类型
        EE[Episode Event]
        RE[Resolution Event]
    end
    
    subgraph 时间线事件
        TEE[TimelineEpisodeEvent]
        TRE[TimelineResolutionEvent]
    end
    
    EE --> TEE
    RE --> TRE
    TEE --> MERGE[合并排序]
    TRE --> MERGE
    MERGE --> RESP[SessionTimelineResponse]

关键指标计算:

  • first_response_seconds:首次响应时间
  • resolution_seconds:解决时间
  • first_response_breached:是否超出 SLA 首次响应阈值
  • resolution_breached:是否超出 SLA 解决时间阈值

资料来源:server/api/timeline.py

9. 多租户架构

Statewave 采用应用层多租户隔离:

配置项默认值说明
STATEWAVE_TENANT_HEADERX-Tenant-ID租户隔离 header
STATEWAVE_REQUIRE_TENANTfalse是否强制要求租户 header
隔离方式查询作用域基于 tenant_id 的数据过滤

当前限制

  • 限流基于 IP 地址,未实现 per-tenant 或 per-API-key 限流
  • 多租户采用应用层隔离,非 PostgreSQL Row-Level Security (RLS)

资料来源:README.md

10. 配置管理

10.1 环境变量配置

变量默认值说明
STATEWAVE_DATABASE_URLPostgreSQL 连接串(必需)
STATEWAVE_LITELLM_API_KEYLLM API 密钥
STATEWAVE_API_KEY服务认证密钥
STATEWAVE_RATE_LIMIT0每 IP 每分钟请求数
STATEWAVE_RATE_LIMIT_STRATEGYdistributed限流策略
STATEWAVE_WEBHOOK_URLWebhook 回调 URL
STATEWAVE_DEFAULT_MAX_CONTEXT_TOKENS4000默认上下文 token 预算

10.2 编译模式配置

模式配置值适用场景
LLM 编译compiler.type=llm生产环境,语义理解
Heuristic 编译compiler.type=heuristicDemo/无 LLM 模式

资料来源:helm/statewave/README.md

11. 部署架构

11.1 Docker 部署

services:
  statewave:
    image: statewavedev/statewave:latest
    ports: ["8100:8100"]
    environment:
      STATEWAVE_DATABASE_URL: postgresql+asyncpg://statewave:statewave@db:5432/statewave
      STATEWAVE_LITELLM_API_KEY: sk-...
    depends_on:
      db:
        condition: service_healthy

11.2 Kubernetes 部署

使用 Helm Chart 部署,包含:

  • Pre-install Job:运行数据库迁移(alembic upgrade head
  • Pre-upgrade Job:升级时重复迁移
  • 支持 existingSecret 引用敏感配置

资料来源:DOCKER.md

12. 启动流程

sequenceDiagram
    participant Client
    participant API as FastAPI App
    participant DB as PostgreSQL
    participant Migrator as Alembic
    
    Client->>API: 启动请求
    API->>Migrator: alembic upgrade head
    Migrator->>DB: 执行迁移
    DB-->>Migrator: 迁移完成
    Migrator-->>API: 就绪
    API-->>Client: 服务可用

13. 外部集成

13.1 连接器生态

Statewave 提供官方连接器将外部数据源摄入为 Episodes:

来源记忆形态状态
MCP ServerAgent 记忆✅ 已发布
GitHubIssues, PRs, Releases✅ 已发布
Markdown文档/决策记忆✅ 已发布
Slack对话记忆✅ 已发布

13.2 SDK 支持

提供 Python SDK 支持自定义摄入路径,连接器独立安装:

npm install @statewavedev/connectors-github
npm install @statewavedev/connectors-markdown
npm install @statewavedev/mcp-server

14. 安全特性

特性说明
API Key 认证通过 Authorization: Bearer <key>
多租户隔离基于 X-Tenant-ID header
敏感标签Memory 支持 sensitivity_labels
数据删除DELETE /v1/subjects/{id} 永久删除

15. 测试架构

测试类型命令依赖
单元测试pytest tests/test_*.py -v无 DB
集成测试pytest tests/integration/ -vPostgreSQL
全部测试pytest tests/ -vPostgreSQL

集成测试数据库配置:

PGPASSWORD=statewave createdb -h localhost -U statewave statewave_test

16. 总结

Statewave 采用分层架构设计,从底层的 PostgreSQL 数据持久化,到服务层的编译引擎、上下文构建、排名服务,再到 API 接入层,构成了一个完整的 AI Agent 记忆管理系统。其核心优势包括:

  1. 事件驱动的摄入:支持多种来源(API、连接器、Webhook)
  2. 灵活的编译引擎:兼容 LLM 和 Heuristic 两种模式
  3. 智能上下文组装:基于 token 预算的排名检索
  4. 企业级功能:多租户、快照、SLA 追踪
  5. 可观测性:健康检查、Webhook 回调

系统当前处于活跃开发状态(v0.8.0),建议生产环境使用语义版本号固定部署。

资料来源:[DOCKER.md](https://github.com/smaramwbc/statewave/blob/main/DOCKER.md)

Episode 管理

Episode(事件)是 Statewave 记忆系统的原子数据单元,代表与特定主题(Subject)相关的每一次交互或事件记录。Episode 采用仅追加(append-only)模式写入,不可直接修改,确保了事件溯源的完整性。

章节 相关页面

继续阅读本节完整说明和来源证据。

概述

Episode(事件)是 Statewave 记忆系统的原子数据单元,代表与特定主题(Subject)相关的每一次交互或事件记录。Episode 采用仅追加(append-only)模式写入,不可直接修改,确保了事件溯源的完整性。

Statewave 通过 Connectors 从多种数据源收集 Episodes,这些事件随后被编译(Compile)为结构化的 Memory(记忆),供 Agent 在推理时检索。

核心职责:

职责说明
事件采集接收并持久化来自各类 Connector 的事件数据
溯源追踪记录每个 Episode 的来源、类型和元数据
时间锚定支持显式事件时间和隐式时间戳
关系映射为后续 Memory 编译建立来源关联

资料来源:README.md:1-50

资料来源:[README.md:1-50](https://github.com/smaramwbc/statewave/blob/main/README.md)

编译器系统

编译器系统(Compiler System)是 Statewave 的核心子系统,负责将原始的对话事件(Episodes)转化为结构化的记忆(Memories)。当新的对话片段被摄入系统后,编译器会分析这些事件,提取有价值的信息,生成可供后续检索和推理使用的记忆条目。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 编译器类型

继续阅读本节完整说明和来源证据。

章节 核心组件

继续阅读本节完整说明和来源证据。

章节 完整工作流

继续阅读本节完整说明和来源证据。

概述

编译器系统(Compiler System)是 Statewave 的核心子系统,负责将原始的对话事件(Episodes)转化为结构化的记忆(Memories)。当新的对话片段被摄入系统后,编译器会分析这些事件,提取有价值的信息,生成可供后续检索和推理使用的记忆条目。

编译过程是幂等操作(idempotent),这意味着对同一批事件重复编译不会产生副作用或重复数据。系统会追踪每个记忆的来源事件(source_episode_ids),确保记忆与原始事件之间的可追溯性。

特性说明
触发方式API 调用 POST /v1/memories/compile 或自动触发
编译模式启发式(heuristic)和 LLM 驱动两种模式
输出产物MemoryRow 记录,包含多种记忆类型
幂等性重复编译安全,不会产生重复记忆

资料来源:README.md:1-30

架构设计

编译器类型

Statewave 支持两种编译策略,可根据部署环境和技术要求选择合适的模式:

编译模式配置值适用场景依赖
启发式编译heuristic演示环境、无 LLM 需求、本地开发无外部依赖
LLM 编译llm生产环境、需要深度语义理解LLM API Key
# Helm 部署配置示例
compiler:
  type: llm  # 或 heuristic

资料来源:helm/statewave/README.md:1-20

核心组件

graph TD
    A[Episode 摄入] --> B{编译模式选择}
    B -->|heuristic| C[HeuristicCompiler]
    B -->|llm| D[LLMCompiler]
    C --> E[提取概要信息]
    C --> F[提取 Profile Facts]
    D --> G[语义分析与总结]
    D --> H[关系抽取]
    E --> I[MemoryRow 生成]
    F --> I
    G --> I
    H --> I
    I --> J[冲突检测]
    J --> K[记忆合并/去重]
    K --> L[持久化存储]

主要组件职责:

组件文件位置职责
Compilerserver/services/compiler.py编译调度、模式路由
HeuristicCompilerserver/services/compilers/heuristic.py规则驱动的记忆提取
LLMCompilerserver/services/compilers/llm.py大语言模型驱动的语义理解
CompileJobserver/services/compile_jobs.py编译任务管理与队列
CompileJobDurableserver/services/compile_jobs_durable.py持久化编译任务支持
ConflictResolverserver/services/conflicts.py记忆冲突检测与消解

编译流程

完整工作流

graph LR
    A[收集未编译 Episodes] --> B{遍历 Episodes}
    B --> C[确定时间锚点]
    C --> D{编译模式}
    D -->|heuristic| E[提取概要 + Facts]
    D -->|llm| F[LLM 分析总结]
    E --> G[生成 MemoryRows]
    F --> G
    G --> H[冲突检测]
    H --> I{存在冲突?}
    I -->|是| J[冲突消解]
    I -->|否| K[直接写入]
    J --> K
    K --> L[更新编译状态]
    L --> M{还有更多 Episodes?}
    M -->|是| B
    M -->|否| N[编译完成]

触发方式

编译可以通过以下方式触发:

  1. 手动触发:调用 POST /v1/memories/compile API
  2. 自动触发:在摄入新 Episode 后自动启动编译
  3. 批量触发:通过 POST /v1/episodes/batch 摄入多集后统一编译

资料来源:README.md:30-45

启发式编译器

概述

启发式编译器(HeuristicCompiler)是一种基于规则的信息提取引擎,无需外部 LLM 依赖即可运行。它通过正则表达式和启发式算法从文本中提取结构化信息。

记忆类型

启发式编译器生成以下类型的记忆:

记忆类型置信度描述TTL 配置
episode_summary0.8对话片段的概要摘要基于 episode_summary TTL
profile_fact0.6从对话中提取的用户 profile 事实基于 profile_fact TTL

资料来源:server/services/compilers/heuristic.py:1-80

时间锚点计算

编译器使用以下优先级确定记忆的时间锚点(valid_from):

def episode_valid_from(ep: EpisodeRow) -> datetime:
    """返回派生记忆的最佳努力时间锚点"""
    # 优先级 1: payload.event_time — 客户端显式设置
    # 优先级 2: payload.messages[0].timestamp — 首条消息时间戳
    # 优先级 3: ep.created_at — 系统记录时间

时间锚点优先级:

优先级来源字段说明
1payload.event_time显式覆盖时间,适用于历史数据回放
2payload.messages[0].timestamp聊天类载荷的首条消息时间戳
3ep.created_at系统自动记录的时间

资料来源:server/services/compilers/heuristic.py:80-100

Profile Facts 提取

Profile Facts 提取器从对话文本中识别用户相关的结构化信息,包括:

  • 用户姓名、职位、公司等基本信息
  • 用户偏好和习惯
  • 技术栈和技能水平
  • 过往交互历史摘要

提取后的 facts 会被封装为独立的 MemoryRow,置信度为 0.6,source_episode_ids 指向原始 Episode。

TTL 计算

每种记忆类型都有预设的存活时间(TTL),通过 compute_valid_to() 函数计算:

def compute_valid_to(kind: str, valid_from: datetime, ttl: dict) -> datetime | None:
    """根据记忆类型计算过期时间"""
    # 返回 valid_from + 对应类型的 TTL

LLM 编译器

概述

LLM 编译器使用大语言模型进行深度语义分析,能够:

  • 理解对话意图和情感
  • 提取隐含的关系和依赖
  • 生成更准确的摘要和总结
  • 识别实体和事件之间的关联

配置要求

llm:
  apiKey: sk-...  # 必须配置
  # 可选配置项
  model: gpt-4    # 指定模型
  temperature: 0.3

提示词策略

LLM 编译器使用精心设计的提示词模板,引导模型生成符合 Statewave 数据模型的记忆结构。提示词设计考虑:

  • 记忆类型的严格分类
  • 置信度评分的指导
  • 时间范围的有效期设定
  • 避免幻觉和重复提取

记忆数据结构

MemoryRow 字段说明

字段类型说明
idUUID记忆唯一标识符
subject_idUUID所属主体 ID
kindstring记忆类型(如 episode_summary、profile_fact)
contenttext记忆内容正文
summarystring内容摘要(前 200 字符)
confidencefloat置信度 0.0-1.0
valid_fromdatetime记忆起始时间
valid_todatetime记忆过期时间(None 表示永不过期)
source_episode_idslist[UUID]源 Episodes ID 列表
metadata_dict扩展元数据
statusstring状态(active、superseded 等)
embeddingvector向量嵌入(用于语义搜索)
sensitivity_labelslist[string]敏感标签
created_atdatetime创建时间
updated_atdatetime更新时间

记忆状态流转

stateDiagram-v2
    [*] --> active: 新建记忆
    active --> superseded: 被新记忆替代
    active --> redacted: 策略过滤
    active --> inactive: 过期
    superseded --> [*]
    redacted --> [*]
    inactive --> [*]

冲突检测与消解

冲突类型

冲突类型描述检测方式
内容重复新记忆与现有记忆内容高度相似文本相似度 > 0.7
时间冲突新旧记忆的时间范围重叠valid_from/valid_to 区间重叠
事实矛盾同一事实的描述相互矛盾实体提取比对
覆盖冲突新记忆应替代而非追加置信度对比

消解策略

策略触发条件处理方式
合并内容高度相似合并 source_episode_ids
替代新记忆置信度更高将旧记忆标记为 superseded
保留两者互补同时保留
丢弃新记忆信息量不足忽略新记忆

资料来源:server/services/conflicts.py:1-50

编译任务管理

同步编译

适用于小批量 Episodes 的实时编译:

result = await compile_job.execute(episode_ids)

持久化任务

对于大批量编译需求,系统提供持久化任务支持:

job = await compile_job_durable.create(
    episode_ids=episode_ids,
    mode="llm",
    priority="normal"
)
任务状态说明
pending等待执行
running执行中
completed成功完成
failed执行失败
cancelled已取消

重试机制

编译任务失败后自动重试,默认策略:

  • 最大重试次数:3
  • 重试间隔:指数退避(1s, 4s, 16s)
  • 永久失败:记录错误日志,标记任务状态

配置参考

环境变量配置

变量名默认值说明
STATEWAVE_COMPILER_TYPEllm编译模式:llm 或 heuristic
STATEWAVE_COMPILER_LLM_MODEL-LLM 模型名称
STATEWAVE_COMPILER_MAX_RETRIES3最大重试次数

Helm Chart 配置

compiler:
  type: llm  # 或 heuristic
  timeout: 300  # 编译超时时间(秒)
  batchSize: 50  # 每批处理 Episodes 数

最佳实践

编译模式选择指南

flowchart TD
    A[选择编译模式] --> B{有 LLM 需求?}
    B -->|是| C[生产环境]
    B -->|否| D{需要深度语义理解?}
    D -->|是| C
    D -->|否| E[开发/演示环境]
    C --> F[LLM 编译器]
    E --> G[Heuristic 编译器]

性能优化建议

  1. 批量摄入:使用 POST /v1/episodes/batch 批量摄入,减少编译次数
  2. 合理选择模式:非必要场景使用 Heuristic 模式降低延迟
  3. 配置 TTL:根据业务需求调整各记忆类型的 TTL,减少存储压力
  4. 监控编译状态:通过 API 监控编译任务的执行情况

调试编译问题

# 检查编译状态
curl http://localhost:8100/v1/memories/search?subject_id=xxx

# 查看编译任务详情
curl http://localhost:8100/admin/jobs?status=failed

相关文档

资料来源:[README.md:1-30]()

上下文检索与排名

上下文检索与排名(Context Retrieval and Ranking)是 Statewave 的核心子系统,负责从海量的记忆(Memory)和事件(Episode)数据中筛选出最相关的内容,并将其组装成符合令牌预算限制的上下文包,供下游 AI 代理使用。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 上下文项(Context Item)

继续阅读本节完整说明和来源证据。

章节 评分项(ScoredItem)

继续阅读本节完整说明和来源证据。

章节 1. 查询解析与参数验证

继续阅读本节完整说明和来源证据。

概述

上下文检索与排名(Context Retrieval and Ranking)是 Statewave 的核心子系统,负责从海量的记忆(Memory)和事件(Episode)数据中筛选出最相关的内容,并将其组装成符合令牌预算限制的上下文包,供下游 AI 代理使用。

该系统的设计目标包括:

  • 相关性优先:基于语义相似度、类型匹配、时间衰减等多维度评分机制
  • 令牌约束:自动裁剪结果以满足 STATEWAVE_DEFAULT_MAX_CONTEXT_TOKENS 配置的令牌预算
  • 幂等性:同一查询在相同数据状态下产生一致的上下文输出
  • 多租户隔离:通过 X-Tenant-ID header 确保跨租户数据的严格隔离

资料来源:server/services/context.py:1-50

核心概念

上下文项(Context Item)

在 Statewave 中,所有可被纳入上下文的实体都被抽象为 Context Item。系统支持两类主要实体:

实体类型数据模型说明
MemoryMemoryRow编译后的记忆条目,包含摘要、置信度、时间范围等信息
EpisodeEpisodeRow原始事件记录,包含完整载荷和来源元数据

每项实体都关联一个 评分(Score),用于排名决策。

评分项(ScoredItem)

ScoredItem 是上下文组装过程中的内部数据结构,用于封装已评分的条目:

class _ScoredItem:
    """An item (memory or episode) with its computed relevance score."""

    __slots__ = ("score", "kind", "memory_row", "episode_row", "text", "section")
字段类型说明
scorefloat计算得出的相关性分数
kindstr条目类型(memory 或 episode)
memory_rowAny关联的 MemoryRow(若 kind 为 memory)
episode_rowAny关联的 EpisodeRow(若 kind 为 episode)
textstr用于语义检索的文本内容
sectionstr条目所属的语义分区

资料来源:server/services/context.py:50-68

系统架构

graph TD
    subgraph "上下文检索与排名系统"
        A[POST /v1/context] --> B[Query Parser]
        B --> C[语义检索模块]
        C --> D[混合评分引擎]
        D --> E[Token Budget Controller]
        E --> F[上下文组装器]
        F --> G[返回 Context Bundle]
    end

    subgraph "数据存储层"
        H[(Memory Table)]
        I[(Episode Table)]
        J[(Embedding Cache)]
    end

    C --> H
    C --> I
    C --> J

检索流程

1. 查询解析与参数验证

客户端通过 POST /v1/context 端点提交上下文请求,请求参数包括:

参数类型必填默认值说明
subject_idstring-目标主题 ID
querystring-检索查询文本
kinteger10返回的 top-k 结果数
max_tokensinteger4000上下文令牌预算上限

系统首先验证租户隔离(STATEWAVE_TENANT_HEADER),确保查询仅访问授权数据。

2. 语义检索

系统通过嵌入服务(Embedding Service)将查询文本转换为向量表示:

# 嵌入服务配置
embedding_provider = "litellm"  # 或 "stub" 用于演示模式

嵌入向量随后用于在向量数据库中执行相似度搜索。Statewave 支持两种嵌入模式:

模式配置值说明
LiteLLMlitellm调用外部 LLM API 生成嵌入向量
Stubstub返回占位符向量,用于无 API Key 的演示场景

资料来源:server/services/embeddings/litellm.py:1-30

3. 查询缓存

为降低嵌入 API 调用成本,系统实现了查询缓存机制:

# 缓存键生成逻辑
cache_key = hashlib.sha256(
    f"{query_text}:{k}:{include_episodes}".encode()
).hexdigest()

缓存有效期由 STATEWAVE_EMBEDDING_CACHE_TTL 配置控制。

资料来源:server/services/embeddings/query_cache.py:1-40

评分与排名机制

混合评分算法

系统在多个维度上计算相关性分数:

评分维度权重数据来源
语义相似度0.4嵌入向量余弦相似度
类型匹配度0.2查询类型与条目类型的匹配程度
时间衰减0.2基于 valid_from 的指数衰减
置信度0.2条目自身的 confidence 字段

最终分数计算公式:

final_score = 0.4 × semantic_score + 0.2 × type_match + 0.2 × time_decay + 0.2 × confidence

排名策略

  1. Primary Sort:按 final_score 降序排列
  2. Secondary Sort:相同分数时,按 created_at 降序排列(优先新条目)
  3. Diversity Boost:对类型多样的结果给予小幅加分,避免结果过度集中

Memory 类型权重

不同类型的记忆在检索时享有不同的基础权重:

记忆类型基础权重说明
episode_summary0.9事件摘要,高信息密度
profile_fact0.8用户画像事实
decision0.85决策记录
default0.7默认类型

资料来源:server/services/context.py:70-120

Token 预算控制

预算分配策略

系统采用 分层预算分配 策略:

graph LR
    A[总预算<br/>max_tokens] --> B[Memory 层<br/>60%]
    A --> C[Episode 层<br/>30%]
    A --> D[元数据层<br/>10%]

裁剪算法

当候选条目总 token 数超过预算时,系统按以下顺序裁剪:

  1. 移除分数最低的 Episode 条目
  2. 合并低置信度的 Memory 摘要
  3. 截断单个 Memory 的 content 字段至 max_tokens_per_item 限制
  4. 若仍超预算,返回部分结果并设置 truncated: true 标志

配置参数

环境变量默认值说明
STATEWAVE_DEFAULT_MAX_CONTEXT_TOKENS4000默认上下文令牌预算
STATEWAVE_MAX_TOKENS_PER_ITEM1000单条目最大 token 数

API 端点

POST /v1/context

功能:组装并返回上下文包

请求示例

curl -X POST http://localhost:8100/v1/context \
  -H "Content-Type: application/json" \
  -H "X-Tenant-ID: tenant-123" \
  -d '{
    "subject_id": "user-001",
    "query": "最近的产品需求讨论",
    "k": 10,
    "max_tokens": 4000
  }'

响应结构

字段类型说明
subject_idstring主题 ID
itemsarray上下文字条目数组
total_tokensinteger实际使用的 token 数
truncatedboolean是否因预算限制被截断
citationsarray引用的原始条目 ID

GET /v1/timeline

功能:获取主题的时间线视图

查询参数

参数类型说明
subject_idstring主题 ID
sincedatetime起始时间(ISO 8601)
untildatetime结束时间(ISO 8601)

资料来源:server/api/context.py:1-80

与 SLA/健康检查的集成

健康评分上下文

上下文检索系统与健康服务(Health Service)共享数据访问层:

# 健康评分的上下文因子
health_factors = {
    "recent_memories": memory_count_last_7d,
    "resolution_rate": resolutions.resolved / resolutions.total,
    "avg_response_time": sla_metrics.avg_response_time,
    "sla_breaches": sla_metrics.breach_count
}

系统通过 /v1/subjects/{id}/health 端点暴露综合健康评分,该评分依赖上下文检索获取近期记忆和 SLA 指标。

资料来源:server/services/health.py:1-60

SLA 指标上下文

SLA 服务在计算响应时间和解决时间时,会向上下文检索模块请求相关 Episode 数据:

# SLA 计算的数据依赖链
timeline_episodes → context_retrieval → 
sla_metrics → health_score
SLA 指标计算方式上下文依赖
first_response_time首条回复距首条消息的时间差/v1/timeline 数据
resolution_time问题解决距首条消息的时间差Resolution Episode
breach_countSLA 违规次数时间窗口内的所有 Episode

资料来源:server/services/sla.py:1-80

性能优化

向量检索优化

  1. 批处理嵌入:将多个短查询合并为单次 API 调用
  2. HNSW 索引:使用 pgvector 的 HNSW 索引加速近似最近邻搜索
  3. 结果缓存:语义相似的结果在短时间窗口内被缓存

缓存策略

缓存类型TTL键生成策略
嵌入结果STATEWAVE_EMBEDDING_CACHE_TTLSHA256(query + k)
上下文包60 秒query hash + subject_id
排名结果300 秒相同

错误处理

错误码场景处理策略
400无效查询参数返回参数校验错误详情
401缺少/无效 API Key要求认证
403租户 ID 不匹配拒绝访问
404主题不存在返回空上下文包
429速率限制X-RateLimit-Reset 重试
500嵌入服务不可用降级至关键词检索

配置参考

完整的上下文检索相关配置项:

# 令牌预算
STATEWAVE_DEFAULT_MAX_CONTEXT_TOKENS=4000

# 嵌入服务
STATEWAVE_EMBEDDING_PROVIDER=litellm
STATEWAVE_EMBEDDING_MODEL=text-embedding-3-small
STATEWAVE_EMBEDDING_CACHE_TTL=3600

# 多租户
STATEWAVE_TENANT_HEADER=X-Tenant-ID
STATEWAVE_REQUIRE_TENANT=false

扩展阅读

资料来源:[server/services/context.py:1-50]()

API 路由参考

本文档提供 Statewave API v1 的完整路由参考,涵盖所有可用端点、请求/响应格式及使用场景。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 基础信息

继续阅读本节完整说明和来源证据。

章节 可用文档界面

继续阅读本节完整说明和来源证据。

概览

Statewave API 基于 FastAPI 构建,提供 RESTful 接口用于管理 Subject(主体)Episode(事件)Memory(记忆)Resolution(解决方案) 等核心实体。API 支持多租户隔离、速率限制和可配置的上下文组装策略。

基础信息

项目
基础 URLhttp://localhost:8100
API 版本v1
认证方式X-API-Key 请求头
租户隔离X-Tenant-ID 请求头
数据格式JSON

可用文档界面

界面URL
Swagger UIhttp://localhost:8100/docs
ReDochttp://localhost:8100/redoc

来源:https://github.com/smaramwbc/statewave / 项目说明书

服务层实现

Statewave 的服务层是业务逻辑的核心载体,负责处理记忆编译、上下文组装、快照管理、内存包操作、交接(handoff)处理、Webhook 通知、速率限制等关键功能。服务层位于 API 路由层与数据库持久层之间,封装了所有复杂的数据处理流程,确保 API 端点保持简洁。

章节 相关页面

继续阅读本节完整说明和来源证据。

概述

Statewave 的服务层是业务逻辑的核心载体,负责处理记忆编译、上下文组装、快照管理、内存包操作、交接(handoff)处理、Webhook 通知、速率限制等关键功能。服务层位于 API 路由层与数据库持久层之间,封装了所有复杂的数据处理流程,确保 API 端点保持简洁。

服务层采用异步架构设计,充分利用 Python 的 asyncio 特性处理 I/O 密集型操作。所有服务模块均支持多租户隔离,通过 tenant_id 参数实现数据层面的访问控制。

来源:https://github.com/smaramwbc/statewave / 项目说明书

数据库架构

Statewave 采用 PostgreSQL 作为主数据库,通过 asyncpg 异步驱动实现高性能数据访问。数据库架构围绕三个核心实体构建:Episode(事件)、Memory(记忆) 和 Subject(主体),支持多租户隔离、快照恢复和时间线查询等高级功能。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Entity-Relationship 概览

继续阅读本节完整说明和来源证据。

章节 主要数据表

继续阅读本节完整说明和来源证据。

章节 EpisodeRow(事件表)

继续阅读本节完整说明和来源证据。

概述

Statewave 采用 PostgreSQL 作为主数据库,通过 asyncpg 异步驱动实现高性能数据访问。数据库架构围绕三个核心实体构建:Episode(事件)Memory(记忆)Subject(主体),支持多租户隔离、快照恢复和时间线查询等高级功能。

资料来源:DOCKER.md:8

核心数据模型

Entity-Relationship 概览

erDiagram
    Subject ||--o{ Episode : contains
    Subject ||--o{ Memory : contains
    Episode ||--o{ Memory : generates
    Subject ||--o{ Resolution : tracks
    Subject ||--o{ SubjectSnapshot : snapshots
    Memory }o--o{ Memory : supersedes

主要数据表

表名用途核心字段
episodes不可变事件记录id, subject_id, session_id, source, type, payload, occurred_at
memories从事件编译的记忆id, subject_id, kind, content, summary, source_episode_ids
resolutions问题解决状态跟踪id, subject_id, session_id, status, resolved_at
subject_snapshots主题时间点快照id, source_subject_id, episode_count, memory_count

资料来源:server/services/snapshots.py:1-100

表结构详解

EpisodeRow(事件表)

事件是 Statewave 的基础数据单元,代表主体(Subject)的任意活动记录。

字段类型说明
idUUID事件唯一标识符
subject_idString关联的主体 ID
session_idString所属会话标识
tenant_idString多租户隔离标识
sourceString事件来源(api, github, slack 等)
typeString事件类型(message, issue, pr 等)
payloadJSONB事件完整负载
metadata_JSONB附加元数据
provenanceJSONB数据溯源信息
occurred_atDateTime事件实际发生时间
created_atDateTime记录创建时间
# 事件创建示例(server/services/snapshots.py:51-65)
EpisodeRow(
    id=uuid.uuid4(),
    subject_id=snapshot_subject,
    session_id=ep.session_id,
    tenant_id=ep.tenant_id,
    source=ep.source,
    type=ep.type,
    payload=ep.payload,
    metadata_=ep.metadata_,
    provenance=ep.provenance,
    occurred_at=ep.occurred_at,
    created_at=ep.created_at,
)

资料来源:server/services/snapshots.py:51-65

MemoryRow(记忆表)

记忆是从事件编译的提炼数据,支持多种类型和有效期管理。

字段类型说明
idUUID记忆唯一标识符
subject_idString关联的主体 ID
kindString记忆类型(episode_summary, profile_fact 等)
contentText完整记忆内容
summaryString摘要(200字符)
confidenceFloat置信度(0-1)
valid_fromDateTime有效期起始
valid_toDateTime有效期结束(可选)
source_episode_idsArray[UUID]源事件 ID 列表
statusString状态(active, superseded 等)
sensitivity_labelsArray[String]敏感度标签
# 记忆创建示例(server/services/compilers/heuristic.py:1-50)
MemoryRow(
    id=uuid.uuid4(),
    subject_id=ep.subject_id,
    kind="episode_summary",
    content=text[:500],
    summary=text[:200],
    confidence=0.8,
    valid_from=ep_valid_from,
    valid_to=compute_valid_to("episode_summary", ep_valid_from, ttl),
    source_episode_ids=[ep.id],
    metadata_={},
    status="active",
)

资料来源:server/services/compilers/heuristic.py:1-50

SubjectSnapshotRow(快照表)

快照用于备份和恢复主体在特定时间点的完整状态。

字段类型说明
idUUID快照唯一标识符
nameString快照名称
versionString版本标识
source_subject_idUUID源主体 ID
episode_countInteger事件数量
memory_countInteger记忆数量
metadata_JSONB快照元数据
# 快照创建示例(server/services/snapshots.py:85-95)
SubjectSnapshotRow(
    name=name,
    version=version,
    source_subject_id=snapshot_subject,
    episode_count=len(eps),
    memory_count=len(mems),
    metadata_=metadata or {},
)

资料来源:server/services/snapshots.py:85-95

异步数据库访问模式

引擎与会话管理

Statewave 使用 SQLAlchemy 2.0 异步引擎,结合 asyncpg 驱动实现非阻塞 IO。

# 异步会话获取模式(server/api/timeline.py:100-120)
from server.db import engine as engine_module

async with engine_module.get_session_factory()() as session:
    base = select(MemoryRow)
    # ... 查询操作

查询构建示例

# 复杂查询:查找引用特定事件的记忆(server/api/timeline.py:130-150)
base = select(MemoryRow).where(
    MemoryRow.tenant_id == tenant_id,
    MemoryRow.subject_id == subject_id,
    func.any_(MemoryRow.source_episode_ids) == episode_uuid
)

资料来源:server/api/timeline.py:100-150

仓储层设计

Repository 模式

数据访问通过 Repository 模式封装,提供统一的 CRUD 操作接口。

graph TD
    A[API Layer] --> B[Service Layer]
    B --> C[Repository Layer]
    C --> D[(PostgreSQL)]
    
    E[Memory Repository] --> C
    F[Episode Repository] --> C
    G[Resolution Repository] --> C

核心仓储操作

操作类型方法说明
创建write_receipt()写入收据记录
读取get_session_factory()获取异步会话
更新compile_memories()编译新记忆
删除批量删除按主体 ID 删除

资料来源:server/db/repositories.py

多租户数据隔离

隔离策略

Statewave 采用应用层多租户隔离,通过 tenant_id 字段实现数据分区。

graph LR
    A[Request] --> B{X-Tenant-ID Header}
    B -->|有租户ID| C[按 tenant_id 过滤]
    B -->|无租户ID| D[拒绝请求]
    
    C --> E[WHERE tenant_id = ?]

环境配置

环境变量默认值说明
STATEWAVE_TENANT_HEADERX-Tenant-ID租户标识头
STATEWAVE_REQUIRE_TENANTfalse是否强制要求租户头
# 租户过滤查询示例
base = select(MemoryRow).where(
    MemoryRow.tenant_id == tenant_id,
    MemoryRow.subject_id == subject_id
)

资料来源:README.md:1-50

时间线与快照管理

时间线查询

支持按时间顺序检索主体的事件和记忆,支持事件合并展示。

# 时间线响应模型(server/api/admin.py:50-80)
class SessionTimelineResponse(BaseModel):
    session_id: str
    status: str
    first_message_at: str | None
    resolved_at: str | None
    episode_count: int
    events: list[TimelineEvent]

快照恢复

快照恢复支持时间偏移(Time Shift),确保恢复后时间戳的连续性。

# 时间偏移处理(server/services/snapshots.py:130-160)
time_shift = target_created_at - snapshot_created_at

# 记忆时间戳偏移
created_at=mem_created + time_shift,
updated_at=mem_updated + time_shift,
valid_from=mem_valid_from + time_shift if mem_valid_from else None,

资料来源:server/services/snapshots.py:130-160

索引与性能优化

推荐索引策略

表名推荐索引用途
memories(subject_id, kind)记忆类型查询
memories(source_episode_ids)事件溯源查询
episodes(subject_id, occurred_at)时间线查询
episodes(session_id)会话聚合

JSONB 字段优化

# JSONB 查询示例
query = select(MemoryRow).where(
    MemoryRow.payload['event_type'].astext == 'message'
)

迁移与版本管理

Alembic 集成

Statewave 使用 Alembic 进行数据库迁移管理。

# Helm 安装时的预安装 Job
alembic upgrade head

迁移执行时机

操作迁移时机
首次安装Pre-install Job
版本升级Pre-upgrade Job

资料来源:helm/statewave/README.md:1-30

配置参考

数据库连接配置

# Docker Compose 配置示例
environment:
  STATEWAVE_DATABASE_URL: postgresql+asyncpg://statewave:statewave@db:5432/statewave

测试环境配置

# 创建测试数据库
PGPASSWORD=statewave createdb -h localhost -U statewave statewave_test
# 集成测试执行
pytest tests/integration/ -v

资料来源:README.md:100-120

最佳实践

数据建模建议

  1. 事件不可变性:事件一旦写入不应修改,通过新事件表达状态变更
  2. 记忆有效期:使用 valid_from/valid_to 管理记忆时效
  3. 源事件追踪:始终维护 source_episode_ids 引用链
  4. 租户隔离:所有查询必须包含 tenant_id 过滤条件

性能注意事项

  1. 避免全表扫描,使用索引覆盖查询
  2. 批量操作使用 BATCH_SIZE = 50 分批处理
  3. 大型导入使用快照机制而非实时编译

资料来源:[DOCKER.md:8]()

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

medium 能力判断依赖假设

假设不成立时,用户拿不到承诺的能力。

medium 维护活跃度未知

新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。

medium 下游验证发现风险项

下游已经要求复核,不能在页面中弱化。

medium 存在评分风险

风险会影响是否适合普通用户安装。

Pitfall Log / 踩坑日志

项目:smaramwbc/statewave

摘要:发现 6 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:能力坑 - 能力判断依赖假设。

1. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 建议检查:将假设转成下游验证清单。
  • 防护动作:假设必须转成验证项;没有验证结果前不能写成事实。
  • 证据:capability.assumptions | github_repo:1219923941 | https://github.com/smaramwbc/statewave | README/documentation is current enough for a first validation pass.

2. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 建议检查:补 GitHub 最近 commit、release、issue/PR 响应信号。
  • 防护动作:维护活跃度未知时,推荐强度不能标为高信任。
  • 证据:evidence.maintainer_signals | github_repo:1219923941 | https://github.com/smaramwbc/statewave | last_activity_observed missing

3. 安全/权限坑 · 下游验证发现风险项

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:下游已经要求复核,不能在页面中弱化。
  • 建议检查:进入安全/权限治理复核队列。
  • 防护动作:下游风险存在时必须保持 review/recommendation 降级。
  • 证据:downstream_validation.risk_items | github_repo:1219923941 | https://github.com/smaramwbc/statewave | no_demo; severity=medium

4. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 建议检查:把风险写入边界卡,并确认是否需要人工复核。
  • 防护动作:评分风险必须进入边界卡,不能只作为内部分数。
  • 证据:risks.scoring_risks | github_repo:1219923941 | https://github.com/smaramwbc/statewave | no_demo; severity=medium

5. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 建议检查:抽样最近 issue/PR,判断是否长期无人处理。
  • 防护动作:issue/PR 响应未知时,必须提示维护风险。
  • 证据:evidence.maintainer_signals | github_repo:1219923941 | https://github.com/smaramwbc/statewave | issue_or_pr_quality=unknown

6. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 建议检查:确认最近 release/tag 和 README 安装命令是否一致。
  • 防护动作:发布节奏未知或过期时,安装说明必须标注可能漂移。
  • 证据:evidence.maintainer_signals | github_repo:1219923941 | https://github.com/smaramwbc/statewave | release_recency=unknown

来源:Doramagic 发现、验证与编译记录