TECHPARTNER CONSULTING

Codester demo · Scripts & Code → Python

Voice Memory — Memory Layer for Voice Agents

Memory layer for voice agents: per-caller briefs in one local JSON file. Node + Python SDKs, personal data scrubbed.

$19 on CodesterEnd-to-end suite: 17 passedDemo below: the package's own two-call demo, run live

Two calls, one caller — watch the memory build

The package ships a demo with two fictional calls from the same caller (Maya). Call 1 ends and the memory is written — personal data scrubbed on the way in. Call 2 opens with the brief already in the system prompt, and the flow planner skips the steps the memory covers. This is the demo's real output.

$ node demo/demo.cjs

┌──────────────────────────────────────────────────────────────┐
│ voice-memory — live demo                                     │
│ Free, self-hosted voice-agent memory · zero dependencies    │
└──────────────────────────────────────────────────────────────┘

▸ STEP 1 — Call 1 ends — recording the transcript

  Caller 5551234567 (Maya) · 1 call(s) recorded
  Stored brief — PII redacted before anything was written:

  preferences (1)
    · Avoid: morning callbacks if you ever need to reach me — please never call after 6pm  [call-1]

  open threads (2)
    · the insurance quote we discussed last week  [call-1]
    · Caller asked: Can you follow up on that  [call-1]

  resolved (1)
    · Marked resolved in call  [call-1]

  facts (1)
    · My email is [email] if you need it  [call-1]


▸ STEP 2 — Call 2 starts — injection block for the system prompt

  ┌─ system prompt · memory block ────────────────────────────┐
  │ [Caller memory — 1 prior call (Maya)]                      │
  │ Preferences: Avoid: morning callbacks if you ever need to  │
  │ reach me — please never call after 6pm.                    │
  │ Open threads: the insurance quote we discussed last week;  │
  │ Caller asked: Can you follow up on that.                   │
  │ Recently resolved: Marked resolved in call.                │
  │ Facts: My email is [email] if you need it.                 │
  └────────────────────────────────────────────────────────────┘

▸ STEP 3 — Flow planning — which scripted steps can be skipped?

  [ASK]  Greet caller
  [ASK]  Verify identity
  [SKIP] Ask callback preferences — Memory covers "morning callbacks"
  [SKIP] Review billing issue — Memory covers "resolved"

  Open threads never skip — they need follow-up.

▸ STEP 4 — Markdown export — the brief as a portable document

  ┌─ brief.md ────────────────────────────────────────────────┐
  │ # Caller brief: Maya                                       │
  │ Calls: 1 · Updated: 2026-11-11T17:47:28.622Z               │
  │                                                            │
  │ ## Preferences                                             │
  │ - Avoid: morning callbacks if you ever need to reach me —  │
  │ please never call after 6pm                                │
  │ ## Open threads                                            │
  │ - the insurance quote we discussed last week               │
  │ - Caller asked: Can you follow up on that                  │
  │ ## Recently resolved                                       │
  │ - Marked resolved in call                                  │
  │ ## Facts                                                   │
  │ - My email is [email] if you need it                       │
  │                                                            │
  └────────────────────────────────────────────────────────────┘

Done. The store lives at demo/demo-store.json — one JSON file, human-readable.
PII redaction is on by default; names are kept because the brief is per-caller.

The store it produced

Everything lives in one local JSON file you can open and read — demo/demo-store.json, written by the run above (excerpt). The Node and Python SDKs read and write the same file.

{
  "version": 2,
  "callers": {
    "5551234567": {
      "callerId": "5551234567",
      "displayName": "Maya",
      "createdAt": "2026-11-11T17:47:28.602Z",
      "updatedAt": "2026-11-11T17:47:28.622Z",
      "callCount": 1,
      "preferences": [
        {
          "text": "Avoid: morning callbacks if you ever need to reach me — please never call after 6pm",
          "addedAt": "2026-11-11T17:47:28.621Z",
          "lastMentionedAt": "2026-11-11T17:47:28.621Z",
          "tags": [],
          "source": "call-1"
        }
      ],
      "openThreads": [
        {
          "text": "the insurance quote we discussed last week",
          "addedAt": "2026-11-11T17:47:28.621Z",
          "lastMentionedAt": "2026-11-11T17:47:28.621Z",
          "tags": [],
          "status": "open",
          "source": "call-1"
        },
        {
          "text": "Caller asked: Can you follow up on that",
          "addedAt": "2026-11-11T17:47:28.622Z",
          "lastMentionedAt": "2026-11-11T17:47:28.622Z",
          "tags": [],
          "status": "open",
          "source": "call-1"
        }
      ],
      "resolvedItems": [
        {
  …

From the package

Screenshots shipped inside the Codester package.

Voice Memory brief output, from the package's own screenshots.

What it does