memoair-livekit
v0.3.2
Published
LiveKit Agents (Node.js) integration for MemoAir voice memory. Drop-in voice.Agent subclass with automatic search-before-reply and save-after-turn.
Maintainers
Readme
memoair-livekit
LiveKit Agents (Node.js) integration for
MemoAir voice memory. The TypeScript sibling of the
Python memoair-livekit package.
MemoAirLiveKitAgent is a drop-in voice.Agent subclass that wires memory into
the agent lifecycle automatically:
- search before each reply —
onUserTurnCompletedrunssearch_memoryand injects the recalled context as a system message before the LLM responds. - save after each assistant turn —
registerSessionEvents(session)forwards completed assistant turns tosaveResponse, so the permanent lane accumulates conversation memory over time.
Recall runs locally against the MemoAir voice-runtime sidecar — no tool-call
round trip, no hot-path network hop.
Install
npm install memoair-livekit @livekit/agents@livekit/agents is a peer dependency.
Usage
import { type JobContext, cli, defineAgent, voice, ServerOptions } from "@livekit/agents";
import * as deepgram from "@livekit/agents-plugin-deepgram";
import * as silero from "@livekit/agents-plugin-silero";
import { LLM } from "@livekit/agents-plugin-openai";
import { MemoAirLiveKitAgent } from "memoair-livekit";
import { fileURLToPath } from "node:url";
export default defineAgent({
prewarm: async (proc) => {
proc.userData.vad = await silero.VAD.load();
},
entry: async (ctx: JobContext) => {
await ctx.connect();
const identity = ctx.room.localParticipant?.identity;
const userId = typeof identity === "string" && identity.trim() ? identity : "console-user";
const agent = new MemoAirLiveKitAgent({
apiKey: process.env.MEMOAIR_API_KEY!,
projectId: process.env.MEMOAIR_PROJECT_ID!,
agentId: process.env.MEMOAIR_AGENT_ID!,
userId,
instructions: "You are a helpful voice assistant with long-term memory.",
});
const session = new voice.AgentSession({
vad: ctx.proc.userData.vad as silero.VAD,
stt: new deepgram.STT(),
llm: new LLM({ model: "gpt-4o" }),
tts: new deepgram.TTS(),
});
// Persist every completed assistant turn back to MemoAir.
agent.registerSessionEvents(session);
// Guarantee onExit fires on shutdown (flushes the runtime session).
ctx.addShutdownCallback(() => agent.onExit());
await session.start({ agent, room: ctx.room });
},
});
cli.runApp(new ServerOptions({ agent: fileURLToPath(import.meta.url) }));A complete, runnable example (with index-build scripts) lives at
examples/livekit/js-voice-agents.
Read-only / org-only
Pass orgOnly: true for Moss-style workspace org retrieval with no per-user
lanes and no turn persistence. In that mode registerSessionEvents is harmless
(the save is skipped).
