OpenCode 长期记忆系统内容整理

目录

  1. 系统概述
  2. 架构设计
  3. 数据模型
  4. 存储内容详解
  5. 核心特性
  6. 技术实现
  7. 使用场景
  8. 最佳实践

系统概述

OpenCode 的长期记忆系统是一个基于 SQLite 数据库的持久化存储方案,旨在为 AI 编程助手提供完整的上下文记忆能力。该系统能够在应用重启后恢复完整的对话历史、代码修改记录、工具调用信息等关键数据。

核心价值

  • 持久化存储:所有对话和数据永久保存在本地数据库
  • 完整上下文:恢复对话时保留所有历史信息
  • 性能优化:智能压缩和索引机制
  • 数据安全:本地存储,隐私可控

架构设计

整体架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    OpenCode Memory 架构                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │
│  │ Session层    │  │ Message层    │  │ Part层       │     │
│  │ (会话管理)   │  │ (消息管理)   │  │ (内容管理)   │     │
│  └──────────────┘  └──────────────┘  └──────────────┘     │
│         │                  │                  │             │
│         └──────────────────┼──────────────────┘             │
│                            ↓                                 │
│                   ┌──────────────┐                          │
│                   │  Database层  │                          │
│                   │  (SQLite)    │                          │
│                   └──────────────┘                          │
│                            ↓                                 │
│                   ┌──────────────┐                          │
│                   │ File System  │                          │
│                   │  (持久化)    │                          │
│                   └──────────────┘                          │
└─────────────────────────────────────────────────────────────┘

存储层次

  1. Session(会话层):管理整个对话会话的生命周期
  2. Message(消息层):存储用户和助手之间的对话消息
  3. Part(部分层):存储消息的具体内容(文本、文件、工具调用等)
  4. Database(数据库层):SQLite 数据持久化
  5. 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,实现了:

  1. 完整的对话历史:永久保存所有对话和上下文
  2. 智能的压缩机制:自动管理存储空间
  3. 灵活的数据模型:支持多种类型的消息和附件
  4. 强大的查询能力:高效的索引和分页查询
  5. 可靠的数据保护:事务和迁移支持

该系统为 AI 编程助手提供了坚实的记忆基础,使得长期项目开发、知识积累和团队协作成为可能。


相关文档

相关推荐
码以致用2 小时前
Java垃圾回收器笔记
java·jvm·笔记
wgzrmlrm744 小时前
Django怎么优雅发送邮件_Python配置SMTP后端实现异步通知
jvm·数据库·python
凤山老林7 小时前
04-Java JDK, JRE和JVM
java·开发语言·jvm
Mr_Xuhhh15 小时前
深入理解JVM:从原理到实践的完整指南
jvm
Rick199315 小时前
Java内存参数解析
java·开发语言·jvm
明湖起风了16 小时前
mqtt消费堆积
java·jvm·windows
Free Tester16 小时前
如何判断 LeakCanary 报告的严重程度
java·jvm·算法
wgzrmlrm741 天前
如何解决ORA-28040没有匹配的验证协议_sqlnet.ora版本兼容设置
jvm·数据库·python
wgzrmlrm741 天前
如何从SQL中提取年份或月份:EXTRACT与日期函数用法
jvm·数据库·python