Files
oh-my-pi/packages/mnemopi
Sunil Srivatsa 49415712f2 fix(memory): separate extraction instructions from user input
The memory-extraction prompt concatenated its instructions, few-shot
examples, and the user message into a single user turn, so a small local
model could not distinguish instructions from input and frequently echoed
the Globex/weather examples instead of extracting facts.

Send the instructions as a real system turn and the raw text as the user
turn. The tiny worker protocol gains a systemPrompt field, and Mnemopi
completion input carries task metadata so the backend selects the right
prompt per call.

Drop the code-built MEMORY_EXTRACTION_TEMPLATE rather than porting it:
prompt text belongs in .md files, and resolveMemoryCompletionInput already
overrides that template for every extraction call, so Mnemopi rendered it
only for the result to be discarded.

Measured on ONNX q4 CPU, LFM2.5-1.2B memory extraction improved from 1/8
to 5/8 once the roles were separated.
2026-08-17 15:06:37 -07:00
..
2026-08-17 22:29:25 +03:00

@oh-my-pi/pi-mnemopi

Local SQLite memory engine for Oh My Pi agents.

This package is the Bun/TypeScript port of the Mnemosyne memory engine. It provides:

  • Mnemopi, a small facade for remember/recall/stats/sleep workflows.
  • BeamMemory, the lower-level working/episodic memory engine.
  • MCP tool definitions and a dispatcher for host integrations.
  • Optional local ONNX embeddings through fastembed and optional OpenAI-compatible embedding/LLM endpoints.

The package does not bundle or download a local GGUF LLM. LLM paths are host-backend or OpenAI-compatible remote only; when no LLM is configured, deterministic heuristic paths are used.

Basic use

import { Mnemopi } from "@oh-my-pi/pi-mnemopi";

const memory = new Mnemopi({ dbPath: "./mnemopi.db", bank: "project" });
const id = memory.remember("The deployment target is stable-cluster.", {
	source: "notes",
	importance: 0.8,
	veracity: "true",
});

const results = memory.recall("deployment target", 5);
console.log(id, results[0]?.content);

memory.close();

Configuration

Mnemopi accepts LLM and embedding options directly. MNEMOPI_* environment variables remain fallbacks/defaults when the matching constructor option is omitted.

import { Mnemopi } from "@oh-my-pi/pi-mnemopi";
import type { Model } from "@oh-my-pi/pi-ai";

const ftsOnly = new Mnemopi({ noEmbeddings: true });

const remoteEmbeddings = new Mnemopi({
	embeddingModel: "text-embedding-3-small",
	embeddingApiUrl: "https://api.openai.com/v1",
	embeddingApiKey: process.env.OPENAI_API_KEY,
});

const remoteLlm = new Mnemopi({
	llm: {
		baseUrl: "https://api.openai.com/v1",
		apiKey: process.env.OPENAI_API_KEY,
		model: "gpt-4.1-mini",
	},
	// Equivalent aliases: llmBaseUrl, llmApiKey, llmModel.
});

declare const smolModel: Model;
const piAiLlm = new Mnemopi({ llm: smolModel });
const dynamicLlm = new Mnemopi({
	llm: async (prompt, opts) => {
		const token = await getFreshOauthToken();
		return await completeWithPiAi(prompt, {
			token,
			maxTokens: opts?.maxTokens,
			temperature: opts?.temperature,
		});
	},
});

Banks and host scoping

Mnemopi itself exposes banks directly through constructor options such as bank; it does not hard-code coding-agent project scoping.

The Oh My Pi coding-agent wrapper adds mnemopi.scoping on top of those constructor options:

  • global: one shared bank
  • per-project: isolated project memory
  • per-project-tagged: project-local writes plus global recall visibility

In per-project-tagged, the wrapper is responsible for combining project-local retention with global recall visibility. The package still just exposes banks plus constructor-level LLM and embedding options.

Common environment fallbacks:

  • MNEMOPI_DATA_DIR / MNEMOPI_DB_PATH: default storage location.
  • MNEMOPI_DB_PAGE_SIZE: optional SQLite page size for new file-backed databases; use a valid power of two from 512 to 65536 or os to request the detected system page size. Unset preserves SQLite's default.
  • MNEMOPI_NO_EMBEDDINGS=1: force FTS-only recall.
  • MNEMOPI_EMBEDDING_MODEL: defaults to BAAI/bge-small-en-v1.5.
  • MNEMOPI_EMBEDDING_API_URL and MNEMOPI_EMBEDDING_API_KEY: OpenAI-compatible embedding endpoint.
  • MNEMOPI_LLM_ENABLED=1, MNEMOPI_LLM_BASE_URL, MNEMOPI_LLM_API_KEY, MNEMOPI_LLM_MODEL: OpenAI-compatible LLM endpoint.

Local embeddings use the fastembed npm package. Its default BGESmallENV15 model is 384-dimensional and uses the package's CLS pooling plus vector normalization path. Local GGUF LLMs are not available in this package.

Commands

mnemopi remember "Use stable-cluster for production deploys"
mnemopi recall "production deploy target"
mnemopi stats
mnemopi sleep

Tests

bun --cwd packages/mnemopi test
bun --cwd packages/mnemopi run check