目录
系统概述
OpenCode 的长期记忆系统是一个基于 SQLite 数据库的持久化存储方案,旨在为 AI 编程助手提供完整的上下文记忆能力。该系统能够在应用重启后恢复完整的对话历史、代码修改记录、工具调用信息等关键数据。
核心价值
- 持久化存储:所有对话和数据永久保存在本地数据库
- 完整上下文:恢复对话时保留所有历史信息
- 性能优化:智能压缩和索引机制
- 数据安全:本地存储,隐私可控
架构设计
整体架构
┌─────────────────────────────────────────────────────────────┐
│ OpenCode Memory 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Session层 │ │ Message层 │ │ Part层 │ │
│ │ (会话管理) │ │ (消息管理) │ │ (内容管理) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ ↓ │
│ ┌──────────────┐ │
│ │ Database层 │ │
│ │ (SQLite) │ │
│ └──────────────┘ │
│ ↓ │
│ ┌──────────────┐ │
│ │ File System │ │
│ │ (持久化) │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
存储层次
- Session(会话层):管理整个对话会话的生命周期
- Message(消息层):存储用户和助手之间的对话消息
- Part(部分层):存储消息的具体内容(文本、文件、工具调用等)
- Database(数据库层):SQLite 数据持久化
- File System(文件系统层):物理存储层
数据模型
核心实体关系
Project (项目)
│
├── Session (会话)
│ │
│ ├── Message (消息)
│ │ │
│ │ └── Part (消息部分)
│ │
│ ├── Todo (任务列表)
│ │
│ └── Permission (权限规则)
│
└── Workspace (工作空间)
数据表结构
1. SessionTable(会话表)
typescript
{
id: SessionID // 会话唯一标识符
project_id: ProjectID // 所属项目ID
workspace_id: WorkspaceID // 工作空间ID
parent_id: SessionID // 父会话ID(支持嵌套会话)
slug: string // URL友好的标识符
directory: string // 工作目录路径
title: string // 会话标题
version: string // 会话版本
share_url: string // 分享链接
// 代码变更摘要
summary_additions: integer // 新增代码行数
summary_deletions: integer // 删除代码行数
summary_files: integer // 修改文件数量
summary_diffs: FileDiff[] // 具体的代码差异
// 回滚信息
revert: {
messageID: MessageID
partID?: PartID
snapshot?: string
diff?: string
}
// 权限配置
permission: PermissionNext.Ruleset
// 时间戳
time_created: integer // 创建时间
time_updated: integer // 更新时间
time_compacting: integer // 压缩时间
time_archived: integer // 归档时间
}
索引设计:
session_project_idx: 项目ID索引session_workspace_idx: 工作空间ID索引session_parent_idx: 父会话ID索引
2. MessageTable(消息表)
typescript
{
id: MessageID // 消息唯一标识符
session_id: SessionID // 所属会话ID
time_created: integer // 创建时间
time_updated: integer // 更新时间
data: InfoData // 消息数据(JSON格式)
}
消息数据结构:
用户消息:
typescript
{
role: "user"
time: {
created: number // 创建时间
}
format?: OutputFormat // 输出格式(文本或JSON Schema)
summary?: {
title?: string // 摘要标题
body?: string // 摘要内容
diffs: FileDiff[] // 代码差异
}
agent: string // 使用的代理名称
model: {
providerID: ProviderID // 模型提供商ID
modelID: ModelID // 模型ID
}
system?: string // 系统提示词
tools?: Record<string, boolean> // 可用工具集合
variant?: string // 变体标识
}
助手消息:
typescript
{
role: "assistant"
time: {
created: number // 创建时间
completed?: number // 完成时间
}
error?: Error // 错误信息(如果发生错误)
parentID: MessageID // 对应的用户消息ID
modelID: ModelID // 使用的模型ID
providerID: ProviderID // 模型提供商ID
mode: string // 模式(已废弃)
agent: string // 代理名称
path: {
cwd: string // 当前工作目录
root: string // 项目根目录
}
summary?: boolean // 是否为摘要消息
cost: number // API调用成本
tokens: {
total?: number // 总Token数
input: number // 输入Token数
output: number // 输出Token数
reasoning: number // 推理Token数
cache: {
read: number // 缓存读取Token数
write: number // 缓存写入Token数
}
}
structured?: any // 结构化输出
variant?: string // 变体标识
finish?: string // 完成原因
}
索引设计:
message_session_time_created_id_idx: 会话ID、创建时间、消息ID联合索引
3. PartTable(消息部分表)
typescript
{
id: PartID // 部分唯一标识符
message_id: MessageID // 所属消息ID
session_id: SessionID // 所属会话ID
time_created: integer // 创建时间
time_updated: integer // 更新时间
data: PartData // 部分数据(JSON格式)
}
部分类型详解:
a. TextPart(文本部分)
typescript
{
type: "text"
id: PartID
sessionID: SessionID
messageID: MessageID
text: string // 文本内容
synthetic?: boolean // 是否为合成文本
ignored?: boolean // 是否被忽略
time?: {
start: number // 开始时间
end?: number // 结束时间
}
metadata?: Record<string, any> // 元数据
}
b. ReasoningPart(推理部分)
typescript
{
type: "reasoning"
id: PartID
sessionID: SessionID
messageID: MessageID
text: string // 推理文本
metadata?: Record<string, any> // 元数据
time: {
start: number // 开始时间
end?: number // 结束时间
}
}
c. FilePart(文件部分)
typescript
{
type: "file"
id: PartID
sessionID: SessionID
messageID: MessageID
mime: string // MIME类型
filename?: string // 文件名
url: string // 文件URL(data URL或远程URL)
source?: FilePartSource // 文件来源
}
// 文件来源类型
type FilePartSource =
| {
type: "file"
path: string
text: {
value: string
start: number
end: number
}
}
| {
type: "symbol"
path: string
range: LSP.Range
name: string
kind: number
text: {
value: string
start: number
end: number
}
}
| {
type: "resource"
clientName: string
uri: string
text: {
value: string
start: number
end: number
}
}
d. ToolPart(工具调用部分)
typescript
{
type: "tool"
id: PartID
sessionID: SessionID
messageID: MessageID
callID: string // 工具调用ID
tool: string // 工具名称
state: ToolState // 工具状态
metadata?: Record<string, any> // 元数据
}
// 工具状态类型
type ToolState =
| {
status: "pending"
input: Record<string, any>
raw: string
}
| {
status: "running"
input: Record<string, any>
title?: string
metadata?: Record<string, any>
time: {
start: number
}
}
| {
status: "completed"
input: Record<string, any>
output: string
title: string
metadata: Record<string, any>
time: {
start: number
end: number
compacted?: number
}
attachments?: FilePart[]
}
| {
status: "error"
input: Record<string, any>
error: string
metadata?: Record<string, any>
time: {
start: number
end: number
}
}
e. SnapshotPart(快照部分)
typescript
{
type: "snapshot"
id: PartID
sessionID: SessionID
messageID: MessageID
snapshot: string // 快照内容
}
f. PatchPart(补丁部分)
typescript
{
type: "patch"
id: PartID
sessionID: SessionID
messageID: MessageID
hash: string // 补丁哈希
files: string[] // 受影响的文件列表
}
g. SubtaskPart(子任务部分)
typescript
{
type: "subtask"
id: PartID
sessionID: SessionID
messageID: MessageID
prompt: string // 子任务提示
description: string // 子任务描述
agent: string // 执行代理
model?: {
providerID: ProviderID
modelID: ModelID
}
command?: string // 执行命令
}
h. StepStartPart(步骤开始部分)
typescript
{
type: "step-start"
id: PartID
sessionID: SessionID
messageID: MessageID
snapshot?: string // 快照
}
i. StepFinishPart(步骤完成部分)
typescript
{
type: "step-finish"
id: PartID
sessionID: SessionID
messageID: MessageID
reason: string // 完成原因
snapshot?: string // 快照
cost: number // 成本
tokens: {
total?: number
input: number
output: number
reasoning: number
cache: {
read: number
write: number
}
}
}
j. AgentPart(代理部分)
typescript
{
type: "agent"
id: PartID
sessionID: SessionID
messageID: MessageID
name: string // 代理名称
source?: {
value: string
start: number
end: number
}
}
k. RetryPart(重试部分)
typescript
{
type: "retry"
id: PartID
sessionID: SessionID
messageID: MessageID
attempt: number // 重试次数
error: APIError // 错误信息
time: {
created: number
}
}
l. CompactionPart(压缩部分)
typescript
{
type: "compaction"
id: PartID
sessionID: SessionID
messageID: MessageID
auto: boolean // 是否自动压缩
overflow?: boolean // 是否溢出
}
索引设计:
part_message_id_id_idx: 消息ID和部分ID联合索引part_session_idx: 会话ID索引
4. TodoTable(任务表)
typescript
{
session_id: SessionID // 所属会话ID
content: string // 任务内容
status: string // 任务状态(pending/in_progress/completed)
priority: string // 优先级(high/medium/low)
position: integer // 位置顺序
time_created: integer // 创建时间
time_updated: integer // 更新时间
}
主键设计:
- 复合主键:
(session_id, position)
索引设计:
todo_session_idx: 会话ID索引
5. PermissionTable(权限表)
typescript
{
project_id: ProjectID // 项目ID(主键)
time_created: integer // 创建时间
time_updated: integer // 更新时间
data: PermissionNext.Ruleset // 权限规则集(JSON格式)
}
6. ProjectTable(项目表)
typescript
{
id: ProjectID // 项目唯一标识符
worktree: string // 工作树路径
vcs: string // 版本控制系统(git等)
name: string // 项目名称
icon_url: string // 项目图标URL
icon_color: string // 图标颜色
time_created: integer // 创建时间
time_updated: integer // 更新时间
time_initialized: integer // 初始化时间
sandboxes: string[] // 沙箱配置列表
commands: {
start?: string // 启动命令
}
}
存储内容详解
1. 对话历史
存储内容:
- 完整的用户和助手对话记录
- 每条消息的时间戳、模型信息、成本统计
- 消息的上下文关系(parent-child关系)
数据结构:
Session
├── Message 1 (User)
│ ├── TextPart: "请帮我优化代码"
│ └── FilePart: code.ts
├── Message 2 (Assistant)
│ ├── StepStartPart
│ ├── ReasoningPart: "分析代码结构..."
│ ├── TextPart: "我发现以下优化点..."
│ ├── ToolPart: edit_tool
│ └── StepFinishPart
└── Message 3 (User)
└── TextPart: "很好,继续优化"
2. 工具调用记录
存储内容:
- 工具名称和调用ID
- 输入参数(JSON格式)
- 输出结果(文本或结构化数据)
- 执行状态(pending/running/completed/error)
- 执行时间和性能指标
示例:
typescript
{
type: "tool",
tool: "edit_file",
callID: "call_abc123",
state: {
status: "completed",
input: {
filePath: "/src/utils.ts",
oldString: "function old()",
newString: "function new()"
},
output: "Successfully edited file",
time: {
start: 1699876543210,
end: 1699876543250
}
}
}
3. 代码变更追踪
存储内容:
- 每次会话的代码修改摘要
- 新增、删除的代码行数统计
- 修改的文件列表
- 具体的代码差异(diff格式)
数据结构:
typescript
{
summary_additions: 45,
summary_deletions: 12,
summary_files: 3,
summary_diffs: [
{
file: "/src/utils.ts",
additions: 30,
deletions: 5,
hunks: [...]
},
{
file: "/src/helper.ts",
additions: 15,
deletions: 7,
hunks: [...]
}
]
}
4. 文件附件
存储内容:
- 用户上传的文件(图片、PDF等)
- 文件的MIME类型和文件名
- 文件内容(data URL或远程URL)
- 文件来源信息(路径、符号、资源)
支持的文件类型:
- 图片:image/png, image/jpeg, image/gif, image/webp
- 文档:application/pdf
- 文本:text/plain
- 目录:application/x-directory
5. 推理过程
存储内容:
- 模型的思考过程(Chain of Thought)
- 推理的开始和结束时间
- 推理文本内容
示例:
typescript
{
type: "reasoning",
text: "让我分析一下这个问题:\n1. 首先...\n2. 然后...\n3. 最后...",
time: {
start: 1699876543210,
end: 1699876543280
}
}
6. 性能指标
存储内容:
- Token使用统计(输入、输出、推理、缓存)
- API调用成本
- 执行时间
- 缓存命中率
数据结构:
typescript
{
cost: 0.0023,
tokens: {
total: 1523,
input: 1200,
output: 323,
reasoning: 150,
cache: {
read: 800,
write: 400
}
}
}
7. 任务管理
存储内容:
- 任务内容和描述
- 任务状态(pending/in_progress/completed)
- 任务优先级(high/medium/low)
- 任务位置顺序
示例:
typescript
[
{
session_id: "sess_abc123",
content: "优化用户认证模块",
status: "completed",
priority: "high",
position: 1
},
{
session_id: "sess_abc123",
content: "添加单元测试",
status: "in_progress",
priority: "medium",
position: 2
}
]
8. 权限规则
存储内容:
- 项目级别的权限配置
- 允许/禁止的操作列表
- 自定义权限规则
示例:
typescript
{
project_id: "proj_xyz789",
data: {
allow: ["read_file", "write_file"],
deny: ["execute_command"],
rules: [
{
pattern: "*.test.ts",
permission: "read-only"
}
]
}
}
核心特性
1. 完整的对话持久化
特性描述:
- 所有对话历史永久保存在本地SQLite数据库
- 支持会话恢复,重启后可继续之前的对话
- 保留完整的上下文信息,包括代码修改历史
实现机制:
typescript
// 创建会话
const session = await SessionManager.create(projectID, agent)
// 添加消息
await SessionManager.addMessage(session.id, {
role: "user",
content: "请帮我优化代码",
parts: []
})
// 恢复会话
const messages = await SessionManager.getMessages(sessionID)
2. 智能上下文压缩
特性描述:
- 自动压缩过长的对话历史
- 保留关键信息,删除冗余内容
- 支持手动和自动压缩模式
压缩策略:
typescript
export class MessageCompressor {
compress(messages: MessageV2.WithParts[]): MessageV2.WithParts[] {
if (messages.length <= 20) return messages
// 保留最近的10条消息
const recent = messages.slice(-10)
// 压缩早期消息
const early = messages.slice(0, -10)
const summary = this.summarize(early)
// 插入摘要消息
return [
{
id: MessageID.generate(),
sessionID: messages[0].sessionID,
role: "system",
content: `Earlier conversation summary:\n${summary}`,
parts: [],
createdAt: new Date()
},
...recent
]
}
}
3. 文件修改时间追踪
特性描述:
- 记录每次文件读取的时间戳
- 防止Agent覆盖用户的修改
- 提供文件冲突检测机制
实现机制:
typescript
export namespace FileTime {
// 记录文件读取时间
export async function read(sessionID: SessionID, filepath: string) {
const stat = await fs.stat(filepath)
await Database.fileTime.put({
sessionID,
filepath,
mtime: stat.mtimeMs
})
}
// 断言文件未被修改
export async function assert(sessionID: SessionID, filepath: string) {
const recorded = await Database.fileTime.get(sessionID, filepath)
if (!recorded) return
const current = await fs.stat(filepath)
if (current.mtimeMs > recorded.mtime) {
throw new Error(
`File ${filepath} has been modified since last read. ` +
`Please read the file again before editing.`
)
}
}
}
4. 多级会话管理
特性描述:
- 支持会话嵌套(父子会话)
- 会话归档和恢复
- 会话版本管理
会话生命周期:
创建会话 → 活跃状态 → 压缩会话 → 归档会话 → 恢复会话
5. 成本和性能监控
特性描述:
- 实时统计API调用成本
- Token使用情况分析
- 缓存命中率监控
监控指标:
typescript
{
cost: 0.0023, // 成本(美元)
tokens: {
total: 1523, // 总Token数
input: 1200, // 输入Token
output: 323, // 输出Token
reasoning: 150, // 推理Token
cache: {
read: 800, // 缓存读取
write: 400 // 缓存写入
}
}
}
6. 数据库迁移支持
特性描述:
- 支持数据库版本迁移
- 自动应用数据库变更
- 保持数据兼容性
迁移机制:
typescript
const MIGRATIONS: Migration[] = [
async (dir) => {
// 迁移逻辑1:从旧格式迁移到新格式
},
async (dir) => {
// 迁移逻辑2:添加新字段
}
]
// 自动应用迁移
for (let index = migration; index < MIGRATIONS.length; index++) {
await MIGRATIONS[index](dir)
}
技术实现
1. 数据库配置
SQLite配置:
typescript
const sqlite = new BunDatabase(Path, { create: true })
sqlite.run("PRAGMA journal_mode = WAL") // Write-Ahead Logging模式
sqlite.run("PRAGMA synchronous = NORMAL") // 同步模式
sqlite.run("PRAGMA busy_timeout = 5000") // 忙等待超时
sqlite.run("PRAGMA cache_size = -64000") // 缓存大小(64MB)
sqlite.run("PRAGMA foreign_keys = ON") // 启用外键约束
sqlite.run("PRAGMA wal_checkpoint(PASSIVE)") // WAL检查点
数据库路径:
typescript
export const Path = iife(() => {
const channel = Installation.CHANNEL
if (["latest", "beta"].includes(channel) || Flag.OPENCODE_DISABLE_CHANNEL_DB)
return path.join(Global.Path.data, "opencode.db")
const safe = channel.replace(/[^a-zA-Z0-9._-]/g, "-")
return path.join(Global.Path.data, `opencode-${safe}.db`)
})
2. ORM框架
Drizzle ORM配置:
typescript
import { drizzle } from "drizzle-orm/bun-sqlite"
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core"
const db = drizzle({ client: sqlite })
// 定义表结构
export const SessionTable = sqliteTable("session", {
id: text().$type<SessionID>().primaryKey(),
project_id: text().$type<ProjectID>().notNull(),
// ... 其他字段
})
3. 事务管理
事务实现:
typescript
export function transaction<T>(callback: (tx: TxOrDb) => T): T {
try {
return callback(ctx.use().tx)
} catch (err) {
if (err instanceof Context.NotFound) {
const effects: (() => void | Promise<void>)[] = []
const result = (Client().transaction as any)((tx: TxOrDb) => {
return ctx.provide({ tx, effects }, () => callback(tx))
})
for (const effect of effects) effect()
return result
}
throw err
}
}
4. 查询优化
索引设计:
- 会话索引:
session_project_idx,session_workspace_idx,session_parent_idx - 消息索引:
message_session_time_created_id_idx - 部分索引:
part_message_id_id_idx,part_session_idx - 任务索引:
todo_session_idx
分页查询:
typescript
export const page = fn(
z.object({
sessionID: SessionID.zod,
limit: z.number().int().positive(),
before: z.string().optional(),
}),
async (input) => {
const before = input.before ? cursor.decode(input.before) : undefined
const where = before
? and(eq(MessageTable.session_id, input.sessionID), older(before))
: eq(MessageTable.session_id, input.sessionID)
const rows = Database.use((db) =>
db
.select()
.from(MessageTable)
.where(where)
.orderBy(desc(MessageTable.time_created), desc(MessageTable.id))
.limit(input.limit + 1)
.all(),
)
// ... 处理结果
}
)
5. 数据迁移
迁移流程:
typescript
const state = lazy(async () => {
const dir = path.join(Global.Path.data, "storage")
const migration = await Filesystem.readJson<string>(path.join(dir, "migration"))
.then((x) => parseInt(x))
.catch(() => 0)
for (let index = migration; index < MIGRATIONS.length; index++) {
log.info("running migration", { index })
const migration = MIGRATIONS[index]
await migration(dir).catch(() => log.error("failed to run migration", { index }))
await Filesystem.write(path.join(dir, "migration"), (index + 1).toString())
}
return { dir }
})
使用场景
1. 长期项目开发
场景描述 :
开发者在一个长期项目中使用OpenCode,需要跨多次会话保持上下文。
记忆内容:
- 项目结构和配置
- 之前的代码修改历史
- 讨论过的设计决策
- 遗留的技术债务
价值:
- 避免重复解释项目背景
- 保持开发思路的连续性
- 快速恢复工作状态
2. 代码审查和优化
场景描述 :
对代码库进行审查和优化,需要跟踪所有修改和建议。
记忆内容:
- 发现的问题列表
- 优化建议和实施情况
- 代码质量指标变化
- 重构步骤记录
价值:
- 系统性地改进代码质量
- 追踪优化进度
- 避免遗漏问题
3. 调试和问题排查
场景描述 :
调试复杂问题,需要记录排查过程和尝试过的解决方案。
记忆内容:
- 错误日志和堆栈信息
- 尝试过的解决方案
- 根因分析过程
- 最终解决方案
价值:
- 避免重复尝试相同方案
- 快速定位问题
- 积累调试经验
4. 知识积累
场景描述 :
在开发过程中学习新技术,需要记录学习笔记和最佳实践。
记忆内容:
- 新技术的学习笔记
- 遇到的坑和解决方案
- 最佳实践和设计模式
- 代码片段和示例
价值:
- 构建个人知识库
- 快速查阅之前的解决方案
- 提高开发效率
5. 团队协作
场景描述 :
团队成员共享会话历史,协作开发项目。
记忆内容:
- 团队讨论记录
- 分工和任务分配
- 代码审查意见
- 集成和部署记录
价值:
- 保持团队信息同步
- 新成员快速上手
- 知识传承
最佳实践
1. 会话管理
建议:
- 为不同的任务创建独立的会话
- 定期归档已完成的会话
- 使用有意义的会话标题
- 利用会话嵌套组织复杂任务
示例:
typescript
// 创建主会话
const mainSession = await SessionManager.create(projectID, {
title: "重构用户认证模块"
})
// 创建子会话
const subSession = await SessionManager.create(projectID, {
title: "实现JWT认证",
parentID: mainSession.id
})
2. 消息组织
建议:
- 保持消息的原子性,一条消息一个主题
- 使用清晰的描述性语言
- 及时总结关键决策
- 标记重要的里程碑
示例:
typescript
// 好的做法
await SessionManager.addMessage(sessionID, {
role: "user",
content: "请优化 src/auth.ts 文件中的密码验证逻辑,目前性能较差",
parts: []
})
// 不好的做法
await SessionManager.addMessage(sessionID, {
role: "user",
content: "优化代码",
parts: []
})
3. 文件管理
建议:
- 在编辑文件前先读取文件
- 使用文件修改时间追踪避免冲突
- 定期清理不需要的文件附件
- 使用相对路径而非绝对路径
示例:
typescript
// 读取文件
const filepath = path.join(projectPath, "src/utils.ts")
await FileTime.read(sessionID, filepath)
const content = await Filesystem.readText(filepath)
// 编辑文件
await FileTime.assert(sessionID, filepath)
await EditTool.execute({
filePath: filepath,
oldString: "old code",
newString: "new code"
}, { sessionID })
4. 性能优化
建议:
- 定期压缩旧的对话历史
- 使用缓存减少重复计算
- 批量处理文件操作
- 监控Token使用情况
示例:
typescript
// 压缩对话历史
const compressor = new MessageCompressor()
const compressed = compressor.compress(messages)
// 监控Token使用
const stats = {
total: messages.reduce((sum, msg) => sum + msg.tokens.total, 0),
cost: messages.reduce((sum, msg) => sum + msg.cost, 0)
}
5. 数据备份
建议:
- 定期备份SQLite数据库文件
- 导出重要会话为JSON格式
- 使用版本控制管理配置文件
- 测试恢复流程
示例:
bash
# 备份数据库
cp ~/.local/share/opencode/opencode.db ~/.local/share/opencode/backup/opencode_$(date +%Y%m%d).db
# 导出会话
opencode session export <session-id> > session_backup.json
6. 安全考虑
建议:
- 不要在对话中存储敏感信息(密码、密钥等)
- 使用环境变量管理敏感配置
- 定期清理包含敏感信息的会话
- 限制数据库文件访问权限
示例:
typescript
// 不好的做法
await SessionManager.addMessage(sessionID, {
role: "user",
content: "我的数据库密码是 password123",
parts: []
})
// 好的做法
await SessionManager.addMessage(sessionID, {
role: "user",
content: "请使用环境变量 DB_PASSWORD 配置数据库连接",
parts: []
})
总结
OpenCode 的长期记忆系统是一个功能完善、设计精良的持久化存储方案。通过 SQLite 数据库和 Drizzle ORM,实现了:
- 完整的对话历史:永久保存所有对话和上下文
- 智能的压缩机制:自动管理存储空间
- 灵活的数据模型:支持多种类型的消息和附件
- 强大的查询能力:高效的索引和分页查询
- 可靠的数据保护:事务和迁移支持
该系统为 AI 编程助手提供了坚实的记忆基础,使得长期项目开发、知识积累和团队协作成为可能。
相关文档: