站点菜单
本文章节

文档

memok-ai 核心库

本文适合谁

本站页面概括 **memok-ai** npm 包(SQLite、MemokPipelineConfig、memok-ai/bridge),不是 OpenClaw 安装教程。

  • 库集成方 — 你有 Node 服务、队列或 CLI,要把长文/对话写入 SQLite 并做召回、强化。
  • 从插件文档跳转来的读者 — 想分清「插件负责什么 / 核心库导出什么」。
  • 核心贡献者 — 参与 galaxy8691/memok-ai 本体(流水线、测试、发布)。

建议阅读路径:

  1. 集成方:快速上手 → 集成指南 → 常见模式 → 环境变量(浏览)→ 相关链接。
  2. OpenClaw 运维:先看本站插件页 /zh/docs/openclaw-plugin 与插件 README;仅在需要 bridge API 形态或 SQLite 语义时回到本页。
  3. 贡献者:环境要求 → 安装方法(克隆)→ 贡献者指南。

说明

安装器、openclaw memok setup、网关/插件兼容矩阵与排障以 https://github.com/galaxy8691/memok-ai-openclaw 为准;本页聚焦 npm 库。

快速上手(约五分钟)

安装包、对新库执行一次建文件、跑一轮入库。需在进程里提供可用的 OpenAI 兼容密钥(或显式传入 openaiApiKey)。**memok-ai 不会替你加载 .env。**

bash

bash
npm install memok-ai

TypeScript(最小)

TypeScript
import { createFreshMemokSqliteFile, articleWordPipeline } from "memok-ai/bridge";

const dbPath = "./data/memok.sqlite";
createFreshMemokSqliteFile(dbPath); // 若库已存在可省略

await articleWordPipeline("你的长文或合并后的对话 …", {
  dbPath,
  openaiApiKey: process.env.OPENAI_API_KEY!,
  openaiBaseUrl: process.env.OPENAI_BASE_URL,
  llmModel: "gpt-4o-mini",
  llmMaxWorkers: 4,
  articleSentencesMaxOutputTokens: 8192,
  coreWordsNormalizeMaxOutputTokens: 32768,
  sentenceMergeMaxCompletionTokens: 2048,
});

接下来:阅读「集成指南」了解导入、召回/反馈与生产配置;「常见集成模式」查看服务骨架示例。

如何选择路径

按目标选一行;第三列指出应优先跟随的文档或仓库。

目标建议原因
给 OpenClaw 助手加持久记忆并用向导配置本站 /zh/docs/openclaw-plugin + 插件 README网关接线、一键脚本、openclaw memok setup、兼容矩阵在插件侧维护,不在核心仓。
在自己的 HTTP/队列/脚本里调用 memoknpm 包 memok-ai(多数场景只 import memok-ai/bridge)配置、密钥、调度以及如何把召回拼进 prompt 都由你掌控。
改流水线或 SQLite 行为克隆 https://github.com/galaxy8691/memok-ai 并按「贡献者指南」需要完整源码、测试与 CI。
纯托管向量语义检索专用向量数据库产品memok-ai 侧重本机 SQLite 上的可强化结构化图,取舍不同(见下文能力说明)。

插件与核心的关系

网关进程加载 memok-ai-openclaw 中的薄扩展;扩展依赖 memok-ai(依赖名常为 memok-ai-core),从 memok-ai-core/bridge 导入稳定 API。SQLite 路径在插件/宿主层配置。无 OpenClaw 时,你的应用直接 import memok-ai 或 memok-ai/bridge。

以下为 Mermaid 源码(可复制到支持 Mermaid 的编辑器或 GitHub 预览中渲染):

OpenClaw 路径

Text
flowchart LR
  subgraph host [OpenClawHost]
    Gateway[GatewayProcess]
  end
  subgraph pluginRepo [memok-ai-openclaw]
    Ext[PluginExtension]
  end
  subgraph corePkg [memok-ai npm]
    Bridge["memok-ai/bridge"]
    Db[(SQLite file)]
  end
  Gateway --> Ext
  Ext --> Bridge
  Bridge --> Db

独立 Node 应用

Text
flowchart LR
  App[你的Node应用] --> Entry["memok-ai 或 memok-ai/bridge"]
  Entry --> Db[(SQLite文件)]

集成指南

主包 memok-ai 导出完整能力;memok-ai/bridge 面向网关类宿主。插件依赖里可能写作 memok-ai-core,npm 发布名仍是 memok-ai。

TypeScript

TypeScript
// 主入口:流水线、SQLite 工具、类型等
import {
  articleWordPipelineV2,
  buildPipelineContext,
} from "memok-ai";

// 网关 / OpenClaw 类宿主常用的稳定子集
import {
  articleWordPipeline,
  dreamingPipeline,
} from "memok-ai/bridge";
导入适用场景
memok-ai/bridge网关、机器人或最小服务:文章入库、dreaming、召回、反馈、建库辅助等
memok-ai定制工具:还需要 articleWordPipelineV2、buildPipelineContext、hardenDb、更深 dreaming 导出等

典型步骤:npm install memok-ai;选定 dbPath;新库调用一次 createFreshMemokSqliteFile(dbPath)(memok-ai 或 memok-ai/bridge)—创建表、dream_logs、索引;文件已存在会抛错,除非传 { replace: true };组装 MemokPipelineConfig 并传给 bridge 函数。

提示

你的应用可以自行使用 dotenv 或读取 K8s Secret;那是宿主责任。memok-ai 内部从不加载 .env,请通过 MemokPipelineConfig 或你已有的配置层传入密钥。

memok-ai/bridge 上的 articleWordPipeline、dreamingPipeline 等接收完整 MemokPipelineConfig(或 DreamingPipelineConfig)。若低层流水线只接受 { ctx },从 memok-ai 导入 buildPipelineContext 并传入 PipelineLlmContext。

TypeScript(单次入库)

TypeScript
import { articleWordPipeline } from "memok-ai/bridge";

await articleWordPipeline(longText, {
  dbPath: "/path/to/memok.sqlite",
  openaiApiKey: process.env.OPENAI_API_KEY!,
  openaiBaseUrl: process.env.OPENAI_BASE_URL,
  llmModel: "gpt-4o-mini",
  llmMaxWorkers: 4,
  articleSentencesMaxOutputTokens: 8192,
  coreWordsNormalizeMaxOutputTokens: 32768,
  sentenceMergeMaxCompletionTokens: 2048,
});

端到端(入库 + 抽样召回 + 反馈)

TypeScript
import {
  type MemokPipelineConfig,
  createFreshMemokSqliteFile,
  articleWordPipeline,
  extractMemorySentencesByWordSample,
  applySentenceUsageFeedback,
} from "memok-ai/bridge";

const dbPath = "./data/memok.sqlite";
createFreshMemokSqliteFile(dbPath); // 新库一次;已有可省略,或 { replace: true }

const memok: MemokPipelineConfig = {
  dbPath,
  openaiApiKey: process.env.OPENAI_API_KEY!,
  openaiBaseUrl: process.env.OPENAI_BASE_URL,
  llmModel: "gpt-4o-mini",
  llmMaxWorkers: 4,
  articleSentencesMaxOutputTokens: 8192,
  coreWordsNormalizeMaxOutputTokens: 32768,
  sentenceMergeMaxCompletionTokens: 2048,
};

await articleWordPipeline("长文或合并后的对话 …", memok);

const recall = extractMemorySentencesByWordSample({ ...memok, fraction: 0.2 });
// 用你的 LLM 根据 recall.sentences 组 prompt,再对实际用到的句子 id 调用:

applySentenceUsageFeedback({
  ...memok,
  sentenceIds: recall.sentences.map((s) => s.id),
});

若要在不写 SQLite 的情况下产出 v2 元组,请用 memok-ai 中的 articleWordPipelineV2 与 buildPipelineContext,而不是 articleWordPipeline。

常见集成模式

以下为骨架示例;请自行补全错误重试、日志与 LLM 客户端。返回值形态以上游包为准。

模式 A — 对话增强:会话结束后入库;下次回复前抽样召回;对实际用于回复的记忆句做反馈加权。

模式 A(骨架)

TypeScript
import {
  type MemokPipelineConfig,
  articleWordPipeline,
  extractMemorySentencesByWordSample,
  applySentenceUsageFeedback,
} from "memok-ai/bridge";

async function afterSession(memok: MemokPipelineConfig, transcript: string) {
  await articleWordPipeline(transcript, memok);
}

async function beforeReply(memok: MemokPipelineConfig) {
  const recall = extractMemorySentencesByWordSample({ ...memok, fraction: 0.2 });
  // const reply = await yourLlm(buildPrompt(recall.sentences));
  return recall;
}

async function reinforce(memok: MemokPipelineConfig, sentenceIds: number[]) {
  await applySentenceUsageFeedback({ ...memok, sentenceIds });
}

模式 B — 批量文档:对多篇文档循环调用 articleWordPipeline,共用同一 MemokPipelineConfig。

模式 B(骨架)

TypeScript
import { articleWordPipeline, type MemokPipelineConfig } from "memok-ai/bridge";

async function indexDocs(memok: MemokPipelineConfig, docs: { id: string; body: string }[]) {
  for (const doc of docs) {
    await articleWordPipeline(doc.body, memok);
  }
}

模式 C — 定时整理:用 cron/队列定时调用 dreamingPipeline;须提供含 dreamLogWarn 的 DreamingPipelineConfig。OpenClaw 插件封装同一函数并自带调度。

模式 C(骨架)

TypeScript
import { dreamingPipeline, type DreamingPipelineConfig } from "memok-ai/bridge";

async function runNightlyDreaming(cfg: DreamingPipelineConfig) {
  await dreamingPipeline(cfg);
}

// 示例:生产环境请用平台调度器,勿依赖 setInterval。
// setInterval(() => { void runNightlyDreaming(dreamCfg); }, 24 * 60 * 60 * 1000);

能力与设计理念

memok-ai 是基于 Node.js + TypeScript 的记忆流水线:用 OpenAI 兼容接口处理长文/对话,将结构化单元写入 SQLite,支持召回、强化与 dreaming。

  • 一步式文章流水线(article-word-pipeline),稳定 JSON 元组
  • SQLite 中 words / normal_words / sentences 及关联表
  • dreaming-pipeline:predream + story-word-sentence
  • OpenClaw 插件在独立仓库中基于同一 bridge 实现按轮召回与可选定时维护

上游自测:在插件召回/上报流程下,候选记忆在回复中被有效利用的比例可超过 95%;仍取决于模型与采样。

插件在库之上提供:按轮召回、memok_report_used_memory_ids 强化、可选 predream/dreaming 对图做维护型遍历。

与「纯向量库」路线的差异(取舍,不断言检索优劣):

memok-ai常见托管向量库
部署本机 SQLite云端 API + 计费
召回依据词图、权重、抽样向量相似度
可解释性结构化表可排查多为相似度分数
隐私默认数据不出机通常需上传宿主外

上游经验:本机 SSD、库不大时,单轮落库 informal 常在约 10² ms、召回 informal 常低于 100 ms——非 SLA;线上可达约千句、十万级关联行量级。

权威说明见:https://github.com/galaxy8691/memok-ai/blob/main/README.zh-CN.md(可对照 https://github.com/galaxy8691/memok-ai/blob/main/README.md)。

环境要求

  • Node.js ≥20(建议 LTS)与 npm
  • OpenClaw:兼容版本见 https://github.com/galaxy8691/memok-ai-openclaw;本核心仓 package.json 不 pin 网关/API 版本。
  • 在本仓首次 npm install 时,better-sqlite3 等原生依赖常占主要耗时,冷启动可需数分钟。

安装方法

1)克隆核心仓做开发

bash

bash
npm install
npm run build
npm test
  • npm install — 会执行 prepare → npm run build
  • npm run build — 仅 tsc
  • npm test — Vitest;设置 OPENAI_API_KEY 时部分测试会调真实 LLM
  • npm run ci — Biome + build + test

测试不会自动读 .env。镜像:https://gitee.com/wik20/memok-ai。

2)npm 依赖:https://www.npmjs.com/package/memok-ai

bash

bash
npm install memok-ai

3)OpenClaw 插件:网关相关步骤见 https://github.com/galaxy8691/memok-ai-openclaw 与本站 /zh/docs/openclaw-plugin。

bash

bash
git clone https://github.com/galaxy8691/memok-ai-openclaw.git
cd memok-ai-openclaw
# openclaw plugins install … && openclaw memok setup(见插件 README)

Dreaming

从 memok-ai/bridge 调用 dreamingPipeline,传入 DreamingPipelineConfig:MemokPipelineConfig + 必填 dreamLogWarn + 可选 maxWords、fraction、minRuns、maxRuns。插件侧调度同一函数。

持久化:每次运行(成败)在 dream_logs 追加一行(dream_date、ts、status、log_json)。dreamLogWarn 用于非致命告警(如无法写 dream_logs);硬错误在记录后仍会抛出。

监控与调试:

  1. 将 dream_logs 视为定时维护任务的主健康信号;每个调度窗口后查看最新若干行。
  2. 只读库执行 SELECT * FROM dream_logs ORDER BY id DESC LIMIT 5;
  3. 失败时看 status = 'error' 与 log_json.error;对比多次 log_json.predream / 故事字段判断合并/衰减是否在推进。
  4. 自建调度时应对连续失败与 predream 计数骤降告警;插件用户应对齐上游建议的 cron 并同样查表。

配置优先级说明(OpenClaw 插件)

对 OPENAI_API_KEY、OPENAI_BASE_URL、MEMOK_LLM_MODEL(使用独立插件时):

  • 进程已有环境变量优先
  • 插件配置仅补齐缺失值

本核心库从不加载 .env;密钥由进程管理器或网关注入。

环境变量

何时需要关心下表:

  • 跑上游测试或本地脚本、用 process.env 拼装配置时。
  • OpenClaw 插件进程用 MEMOK_* 填默认项时(见配置优先级)。
  • 线上服务仍应优先用显式 MemokPipelineConfig,而非隐式依赖环境表。

谁会读这些变量?

  1. OpenClaw 插件进程 — 组装配置时可用 MEMOK_* 补缺
  2. 本仓库测试与旧路径 — 未显式传配置对象时可能读 process.env
  3. 库集成方 — 生产不应依赖下表;应显式构造 MemokPipelineConfig

各阶段模型名等见源码 resolveModel 等辅助说明。

变量是否必填用途设置后的作用
OPENAI_API_KEY走 env 组装时必填兼容 OpenAI 的密钥未显式传入 openaiApiKey 且从环境组装配置时使用
OPENAI_BASE_URL自建或代理网关覆盖客户端默认的 OpenAI 主机
MEMOK_LLM_MODEL快速切换默认模型配置未指定模型名时的默认值
MEMOK_DB_PATH快速指定 SQLite 路径env 辅助解析 dbPath 时默认 ./memok.sqlite
MEMOK_LLM_MAX_WORKERS限制并行 LLM 调用大于 1 的整数可在文章阶段启用有界并行
MEMOK_V2_ARTICLE_SENTENCES_MAX_OUTPUT_TOKENS限制文章分句阶段输出该阶段的 token 上限(会 clamp)
MEMOK_CORE_WORDS_NORMALIZE_MAX_OUTPUT_TOKENS限制规范化阶段输出该阶段的 token 上限(会 clamp)
MEMOK_SENTENCE_MERGE_MAX_COMPLETION_TOKENS限制合并补全合并阶段的 token 上限(会 clamp)
MEMOK_SKIP_LLM_STRUCTURED_PARSE调试 / 容错为真时跳过已实现处的严格结构化解析

说明

变量全集与边界情况可能随版本变化,升级时请对照 https://github.com/galaxy8691/memok-ai/blob/main/README.zh-CN.md。

性能与调优(定性)

下列为实践向说明,无固定 SLA;请在自家环境实测。

主题实践要点
SQLite 路径dbPath 放在本地 SSD;仅测试时可考虑 :memory:,生产是否适用请以上游说明为准。
并行llmMaxWorkers > 1 会加快文章阶段但增加并发请求;遇限流或内存压力应调低。
Token 上限各阶段 max tokens 影响成本与超时概率;调高可能更贵更慢,调低可能截断。
better-sqlite3原生依赖,冷安装慢; modest 库规模下运行时瓶颈多在 LLM 往返。
经验延迟上游描述单轮落库 informal 约 10² ms、召回 informal 常低于 100 ms,仅供参考。

贡献者指南

针对核心仓库(非插件)的入门流程:

  1. 克隆 galaxy8691/memok-ai,使用 Node 20+。
  2. npm install 后执行 npm run ci 再开 PR。
  3. 仅在需要跑会调远程模型的测试时设置 OPENAI_API_KEY(见 CONTRIBUTING.md)。
  4. 若跳过 install 钩子,改 src/ 后执行 npm run build。

无 memok-ai 独立 dev CLI。openclaw memok setup 等属于网关,请以 openclaw --help 与插件 README 为准。

脚本用途典型用法
buildTypeScript 编译(tsc)npm run build
test运行 Vitest 一次npm test
lintBiome 检查npm run lint
formatBiome 格式化写入npm run format
cilint + build + testnpm run ci
prepare安装时 buildnpm install(钩子)

贡献说明:https://github.com/galaxy8691/memok-ai/blob/main/CONTRIBUTING.md