1import{j as e,d as c}from"./index-OkXy-d5Y.js";import{S as h}from"./SeoHead-B8UDfQqR.js";import{C as l,a as x}from"./CTASection-CU6payEt.js";import{E as u,C as y,S as d}from"./CodeWindow-BIXuFLiG.js";import{T as m,U as g}from"./UseCasesSection-fkSRwiTD.js";import"./CopyButton-Bg3eIyIl.js";function f(){return e.jsx(l,{as:"section",children:e.jsxs("div",{className:"py-[62px] pb-[22px] max-w-[780px]",children:[e.jsx(u,{children:"The memory layer"}),e.jsx("h1",{className:"display text-[length:var(--h1-size)] text-foreground mb-4",children:"Persistent memory your LLM app can query in plain language."}),e.jsx("p",{className:"text-[18px] text-muted-foreground max-w-[62ch] leading-[1.6]",children:"Store any text; Smritea extracts the facts, links the entities, and gives every user their own searchable memory. Here's what each capability does â and the problem it solves."})]})})}function b({badge:a,children:r,className:o}){return e.jsxs("div",{className:c("my-1.5 grid grid-cols-1 items-start gap-4 rounded-[var(--radius-card)] border border-(--color-border) bg-muted px-[22px] py-5 shadow-[var(--elev-1)] md:grid-cols-[auto_1fr]",o),children:[e.jsx("span",{className:"whitespace-nowrap pt-0.5 font-mono text-[13.5px] font-semibold text-primary",children:a}),e.jsx("p",{className:"text-sm leading-[1.6] text-muted-foreground [&_b]:font-semibold [&_b]:text-foreground",children:r})]})}function j({note:a,sources:r,className:o}){return e.jsxs("div",{className:c("mt-3.5 font-mono text-[11px] leading-normal text-muted-foreground",o),children:[a&&e.jsxs(e.Fragment,{children:[a,e.jsx("br",{})]}),r.map((t,s)=>e.jsxs("span",{children:[s>0&&" · ",t.label," ",e.jsx("a",{href:t.href,target:"_blank",rel:"noopener",className:"text-primary underline [text-underline-offset:2px]",children:new URL(t.href).hostname.replace(/^www\./,"")})]},t.href))]})}function i({number:a,title:r,body:o,cite:t,proof:s,className:p}){return e.jsxs("div",{className:`grid grid-cols-1 items-center gap-10 border-t border-(--color-border) py-[46px] first:border-t-0 md:grid-cols-[1.05fr_0.95fr] ${p??""}`,children:[e.jsxs("div",{children:[e.jsx("div",{className:"eyebrow mb-3 text-xs",children:a}),e.jsx("h3",{className:"mb-3 display text-[length:var(--h2-size)] text-foreground",children:r}),e.jsx("p",{className:"m-0 max-w-[54ch] text-[15px] leading-[1.66] text-muted-foreground [&_.mono]:rounded-[5px] [&_.mono]:border [&_.mono]:border-(--color-border) [&_.mono]:bg-muted [&_.mono]:px-1.5 [&_.mono]:text-[13px] [&_.mono]:text-foreground [&_.mono]:font-mono",children:o}),e.jsx(j,{note:t.note,sources:t.sources})]}),e.jsx("div",{className:"archframe-card p-6",children:e.jsx(y,{label:s.label,snippets:{[s.lang??"text"]:s.snippet},terminalTokens:s.tokens,showCopy:!1})})]})}const v=[{text:"scope: { actorId: "},{text:'"user-123"',tone:"string"},{text:", actorType: "},{text:'"user"',tone:"string"},{text:` } 2`},{text:"// actorType: user · agent · system",tone:"comment"},{text:` 3`},{text:"// + optional conversationId to thread a chat",tone:"comment"}],w=[{text:"quick_search",tone:"function"},{text:" "},{text:"vector only · fastest",tone:"comment"},{text:` 4`},{text:"deep_search",tone:"function"},{text:" "},{text:"graph walk · ~700ms p50",tone:"comment"},{text:` 5`},{text:"context_aware",tone:"function"},{text:" "},{text:"conversation + LLM",tone:"comment"}],N=[{text:"Alice ââ"},{text:"works_on",tone:"function"},{text:"âââ¶ Atlas ââ"},{text:"owned_by",tone:"function"},{text:`âââ¶ Platform 6 7deep_search · graph_depth: `},{text:"2",tone:"number"},{text:` 8`},{text:"// depth 1â5 · 0 = app default",tone:"comment"}],k=[{text:"metadata_filter: { "},{text:'"level"',tone:"string"},{text:": { "},{text:'"$gte"',tone:"string"},{text:": "}
8,{text:"4",tone:"number"},{text:` } } 9 10`},{text:"// $eq $ne $gt $gte $lt $lte $in $nin",tone:"comment"},{text:` 11`},{text:"// $and · $or · $not",tone:"comment"}],_=[{text:"active_from: "},{text:'"2026-01-01"',tone:"string"},{text:` 12active_to: null `},{text:"// still valid",tone:"comment"},{text:` 13search · valid_at: `},{text:'"2026-03-01"',tone:"string"},{text:" "},{text:"// point-in-time",tone:"comment"}];function S(){return e.jsx("section",{className:"section",children:e.jsxs(l,{children:[e.jsx(i,{number:"01 · Scoped memory",title:"Every user's memory stays their own.",body:e.jsxs(e.Fragment,{children:["Stateless bots make people repeat themselves every session, and multi-tenant apps risk leaking one customer's context into another's. Tag each memory with a ",e.jsx("span",{className:"mono",children:"scope"})," â an actor (",e.jsx("span",{className:"mono",children:"user"}),", ",e.jsx("span",{className:"mono",children:"agent"}),", or ",e.jsx("span",{className:"mono",children:"system"}),") inside your app, optionally a conversation â and every search reads back only that actor's memories. Per-user isolation and per-agent memory, with no extra bookkeeping."]}),cite:{note:"Why it matters: 81% react negatively when forced to repeat themselves; 11% abandon on the first repeat.",sources:[{label:"Sinch â",href:"http://sinch.com/blog/context-preservation-ai-communications/"},{label:"Parloa/CFO Dive â",href:"https://www.cfodive.com/news/customers-losing-patience-automated-customer-support/823519/"}]},proof:{label:"scope",snippet:`scope: { actorId: "user-123", actorType: "user" } 14// actorType: user · agent · system 15// + optional conversationId to thread a chat`,lang:"text",tokens:v}}),e.jsx(i,{number:"02 · Three search strategies",title:"Match the search depth to the moment.",body:e.jsxs(e.Fragment,{children:["A live chat needs a fast answer; an agent reasoning over a task needs the whole web of related facts. Pick per query: ",e.jsx("span",{className:"mono",children:"quick_search"})," runs pure vector similarity for the lowest latency; ",e.jsx("span",{className:"mono",children:"deep_search"})," traverses the knowledge graph for maximal coverage; ",e.jsx("span",{className:"mono",children:"context_aware_search"})," uses conversation history and an LLM to resolve who âtheyâ and âitâ refer to. Set a default per app, override on any call."]}),cite:{note:"Why it matters: retrieval quality and latency trade off non-linearly â strong rerankers add seconds per query, so a fixed depth is wrong for half your queries.",sources:[{label:"HyperRAG, arXiv 2504.02921 â",href:"https://arxiv.org/abs/2504.02921"}]},proof:{label:"search",snippet:`quick_search vector only · fastest 16deep_search graph walk · ~700ms p50 17context_aware conversation + LLM`,lang:"text",tokens:w}}),e.jsxs(b,{badge:"add() â 3s",children:[e.jsx("b",{children:"Writing a memory isn't a bare insert."})," Every ",e.jsx("span",{className:"font-mono text-[color:inherit]",children:"add()"})," runs full LLM entity extraction and links the results into the graph, plus a multi-index creation â ~3 seconds per call. That's exactly what makes ",e.jsx("span",{className:"font-mono text-[color:inherit]",children:"deep_search"})," and entity resolution possible later."]}),e.jsx(i,{number:"03 · Knowledge graph",title:"Connected context, without manual tagging.",body:e.jsxs(e.Fragment,{children:["Agents reason best when related facts are linked. Every memory's entities are extracted, de-duplicated, and connected automatically â âAliceâ, â[email protected]â, and âthe new PMâ resolve to one entity. ",e.jsx("span",{className:"mono",children:"deep_search"})," walks those relationships (depth 2 by default, ",e.jsx("span",{className:"mono",children:"graph_depth"})," to override) so a query about one thing surfaces everything connected to it. No tags, no schema."]}),cite:{note:"Why it matters: graph traversal lifts multi-hop QA accuracy well beyond vector-only retrieval on connected data.",sources:[{label:"StepChain GraphRAG, arXiv 2510.02827 â",href:"https://arxiv.org/abs/2510.02827"}]},proof:{label:"graph",snippet:`Alice ââworks_onâââ¶ Atlas ââowned_byâââ¶ Platform 18 19deep_search · graph_depth: 2 20// depth 1â5 · 0 = app default`,lang:"text",tokens:N}}),e.jsx(i,{number:"04 · Metadata filters",title:"Filter retrieval down to exactly what you want.",body:e.jsxs(e.Fragment,{children:["Document Q&A and tag-scoped re
20call need more than similarity. Attach arbitrary keyâvalue ",e.jsx("span",{className:"mono",children:"metadata"})," to any memory, then filter at search time with a MongoDB-style operator DSL â comparisons (",e.jsx("span",{className:"mono",children:"$eq"}),", ",e.jsx("span",{className:"mono",children:"$gte"}),", ",e.jsx("span",{className:"mono",children:"$in"}),", â¦) and logic (",e.jsx("span",{className:"mono",children:"$and"}),", ",e.jsx("span",{className:"mono",children:"$or"}),", ",e.jsx("span",{className:"mono",children:"$not"}),"). Values are strings or numbers; the filter runs inside the vector store."]}),cite:{note:"Why it matters: metadata pre-filtering narrows the search space and raises retrieval precision over pure similarity.",sources:[{label:"Microsoft Azure AI Search â",href:"https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/boost-rag-performance-enhance-vector-search-with-metadata-filters-in-azure-ai-se/4208985"}]},proof:{label:"filter",snippet:`metadata_filter: { "level": { "$gte": 4 } } 21 22// $eq $ne $gt $gte $lt $lte $in $nin 23// $and · $or · $not`,lang:"text",tokens:k}}),e.jsx(i,{number:"05 · Lifecycle & time",title:"Context that expires when it should.",body:e.jsxs(e.Fragment,{children:["Some facts have a shelf life â a project deadline, a role that changed. Each memory carries ",e.jsx("span",{className:"mono",children:"active_from"})," / ",e.jsx("span",{className:"mono",children:"active_to"})," lifecycle fields, and search can ask for a point in time with ",e.jsx("span",{className:"mono",children:"valid_at"})," plus temporal decay that favors recent memories. Store what was true, and when â then recall the world as it stood on any date."]}),cite:{note:"Why it matters: stale, timeless context is a documented cause of LLM hallucination; versioned temporal facts mitigate it.",sources:[{label:"Drowzee, arXiv 2502.13416 â",href:"https://arxiv.org/abs/2502.13416"}]},proof:{label:"temporal",snippet:`active_from: "2026-01-01" 24active_to: null // still valid 25search · valid_at: "2026-03-01" // point-in-time`,lang:"text",tokens:_}})]})})}function $(){return e.jsx("section",{className:"section",children:e.jsxs(l,{children:[e.jsx(d,{eyebrow:"More use cases",title:"Beyond the obvious.",lead:"Two more places persistent memory changes the product."}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2",children:[e.jsx(m,{title:"Voice interfaces with context",body:"Voice assistants can't scroll back â they need to remember. Store user preferences and conversation history so your voice app picks up where it left off."}),e.jsx(m,{title:"Team knowledge that's searchable",body:"Meeting notes, project decisions, and team context are scattered across tools. Store them as memories and let your team query everything in natural language."})]})]})})}function P({isStatement:a,nots:r,className:o}){return e.jsx("section",{className:`section ${o??""}`,children:e.jsxs(l,{children:[e.jsx(d,{eyebrow:"Where it fits",title:"What Smritea is â and isn't."}),e.jsxs("div",{className:"my-4 mb-7 max-w-[72ch] border-l-[3px] border-primary pl-[18px]",children:[e.jsx("span",{className:"eyebrow mb-2.5 block text-[11px]",children:"What it is"}),e.jsx("p",{className:"m-0 font-[family-name:var(--font-display)] text-[clamp(20px,2.2vw,27px)] leading-[1.34] tracking-[-0.01em] text-foreground [&_b]:font-semibold",children:a})]}),e.jsx("div",{className:"mb-3.5 font-mono text-[11px] uppercase tracking-[0.12em] text-muted-foreground",children:"What it's not"}),e.jsx("div",{className:"grid grid-cols-1 gap-[22px] md:grid-cols-3",children:r.map(t=>e.jsxs("div",{children:[e.jsxs("p",{className:"mb-1.5 text-[15.5px] font-semibold text-foreground",children:[e.jsx("span",{className:"font-medium text-muted-foreground",children:"Not"})," ",t.title]}),e.jsx("p",{className:"m-0 text-[13.5px] leading-[1.58] text-muted-foreground",children:t.body})]},t.title))})]})})}function n({label:a,title:r,body:o,className:t}){return e.jsxs("div",{className:c("archframe-card px-[18px] py-4",t),children:[e.jsx("span",{className:"mb-2.5 inline-block rounded-md border border-(--color-border) bg-muted px-2 py-[3px] font-mono text-[11.5px] text-primary",children:a}),e.jsx("h5",{className:"mb-1 text-[14.5px] font-semibold text-foreground",children:r}),e.jsx("p",{className:"text-[13px] leading-[1.52] text-muted-foreground",children:o})]})}function C(){return e.jsx("section",{className:"section",children:e.jsxs(l,{children:[e.jsx(d,{eyebrow:"Platform",title:"Everything around the memory.",lead:"The surface that makes the memory usable in production."}),e.jsxs("div",{className:"mt-[22px] grid grid-cols-1 gap-3.5 md:grid-cols-2",children:[e.jsx(n,{label:"pip · npm",title:"Python & TypeScript SDKs",body:"Four methods â add, search, get, delete â with automatic retry & backoff. Published on PyPI and npm."}),e.jsx(n,{label:"npx smritea-mcp",title:"MCP server",body:"A Model Context Protocol server exposing memory tools to Claude, Cursor & AI assistants (stdio + SSE)."}),e.jsx(n,{label:"conversation_id",title:"Conversation tracking",body:"Group memories into a thread and recall a multi-turn exchange together, in order."}),e.jsx(n,{label:"actor_type",title:"Actor identity",body:"Tag memories as user, agent, or system â each actor gets its own private memory space."}),e.jsx(n,{label:"org â team â app â key",title:"Multi-tenant & keys",body:"Isolated memory per app; quotas & rate limits per plan at the org level. App-scoped API keys you create, rotate, and revoke."}),e.jsx(n,{label:"smritea-oss",title:"Open-source core",body:"The engine is open source;
25 Smritea Cloud is the hosted version with auth, teams, billing, and managed infra."})]})]})})}function F(){return e.jsxs("div",{children:[e.jsx(h,{title:"Product â Memory API for LLM Apps",description:"Explore Smritea's capabilities: scoped memory, three search strategies, a knowledge graph, metadata filters, and temporal memory lifecycle.",path:"/product"}),e.jsx(f,{}),e.jsx(S,{}),e.jsx(g,{}),e.jsx($,{}),e.jsx(P,{isStatement:e.jsxs(e.Fragment,{children:["The memory layer you plug into your existing stack â store context, retrieve it by meaning, and hand it to your LLM, ",e.jsx("b",{children:"per user, across sessions"}),"."]}),nots:[{title:"a vector database",body:e.jsxs(e.Fragment,{children:["Smritea runs Qdrant and ArangoDB under the hood; you never manage indexes or collections â just"," ",e.jsx("span",{className:"mono",style:{fontSize:"12.5px"},children:"add()"})," and"," ",e.jsx("span",{className:"mono",style:{fontSize:"12.5px"},children:"search()"}),"."]})},{title:"a RAG framework",body:"It's the memory layer you plug into your existing RAG pipeline. It stores and retrieves context â it doesn't run your LLM or manage your prompts."},{title:"an LLM orchestrator",body:"No chains, no agents, no prompt templates. Smritea gives your orchestrator (LangChain, LlamaIndex, your own code) a memory backend."}]}),e.jsx(C,{}),e.jsx(x,{body:"Create an account, set up an app, and store your first memory in minutes."})]})}export{F as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.