Documentation Index Fetch the complete documentation index at: https://docs.memvid.com/llms.txt
Use this file to discover all available pages before exploring further.
Build AI applications, agents, and data pipelines with the Memvid Python SDK. Native Rust bindings deliver high performance with a Pythonic API.
Installation
Requirements: Python 3.8+, macOS/Linux/Windows. Native bindings included - no extra dependencies needed.
create() will OVERWRITE existing files without warning!Function Purpose If File Exists Parameter Order create(path)Create new .mv2 file DELETES all data path first (kind is keyword-only) use(kind, path)Open existing .mv2 file Preserves data kind first, then path
Always check if the file exists before choosing — see example below.
Quick Start
from memvid_sdk import create, use
import os
path = 'knowledge.mv2'
# CRITICAL: Check if file exists to avoid data loss!
if os.path.exists(path):
mem = use( 'basic' , path) # Open existing file (kind first!)
else :
mem = create(path) # Create new file (path first!)
# Lexical search (BM25) is enabled by default - no need to call enable_lex()
# Add documents
mem.put(
title = 'Meeting Notes' ,
label = 'notes' ,
metadata = { 'source' : 'slack' },
text = 'Alice mentioned she works at Anthropic...'
)
# Search works immediately
results = mem.find( 'who works at AI companies?' , k = 5 , mode = 'lex' )
print (results[ 'hits' ])
# Ask questions
answer = mem.ask( 'What does Alice do?' , k = 5 , mode = 'lex' )
print (answer[ 'answer' ])
# Seal when done (commits changes)
mem.seal()
API Reference
Category Methods Description File Operations create, use, closeCreate, open, close memory files Data Ingestion put, put_many, put_file, put_filesAdd documents with embeddings Search find, ask, timelineQuery your memory Corrections correct, correct_manyStore ground truth with retrieval boost Memory Cards memories, state, enrich, add_memory_cardsStructured fact extraction Tables put_pdf_tables, list_tables, get_tablePDF table extraction Sessions session_start, session_end, session_replayTime-travel debugging Tickets sync_tickets, current_ticket, get_capacityCapacity management Security lock, unlock, lock_who, lock_nudgeEncryption and access control Utilities verify, doctorMaintenance and utilities
Context Manager
import memvid_sdk as memvid
# Automatically closes when done
with memvid.use( 'basic' , 'memory.mv2' ) as mem:
mem.put( 'Doc' , 'test' , {}, text = 'Content' )
results = mem.find( 'query' )
Core Functions
File Operations
from memvid_sdk import create, use, lock, unlock, info
# Create new memory file
mem = create( 'project.mv2' )
# With options
mem = create(
'project.mv2' ,
enable_vec = True , # Enable vector index
enable_lex = True , # Enable lexical index
memory_id = 'mem_abc' , # Bind to dashboard
api_key = 'mv_live_...' # Dashboard API key
)
# Open existing memory with adapter
mem = use( 'basic' , 'project.mv2' , mode = 'open' )
# Available adapters
mem = use( 'langchain' , 'file.mv2' )
mem = use( 'llamaindex' , 'file.mv2' )
mem = use( 'crewai' , 'file.mv2' )
mem = use( 'autogen' , 'file.mv2' )
mem = use( 'haystack' , 'file.mv2' )
mem = use( 'langgraph' , 'file.mv2' )
mem = use( 'semantic-kernel' , 'file.mv2' )
mem = use( 'openai' , 'file.mv2' )
mem = use( 'google-adk' , 'file.mv2' )
# Get SDK info
sdk_info = info()
# Verify file integrity
result = mem.verify( deep = True )
# Repair and optimize
result = mem.doctor(
rebuild_time_index = True ,
rebuild_vec_index = True ,
vacuum = True
)
Context Manager Support
from memvid_sdk import create
# Automatically closes when done
with create( 'project.mv2' ) as mem:
mem.put( 'Title' , 'label' , {}, text = 'Content' )
results = mem.find( 'query' )
Auto-Embedding
The SDK automatically enables vector embeddings when OPENAI_API_KEY is set in your environment:
import os
os.environ[ 'OPENAI_API_KEY' ] = 'sk-...'
# Embeddings are automatically enabled using text-embedding-3-small
mem.put( title = 'Doc' , label = 'kb' , metadata = {}, text = 'Content here' )
How it works:
If OPENAI_API_KEY is set and enable_embedding is not specified, embeddings are auto-enabled
Uses OpenAI’s text-embedding-3-small model (1536 dimensions)
If no API key is present and no model specified, falls back to local bge-small (384 dimensions)
Environment Default Behavior OPENAI_API_KEY setAuto-enable with text-embedding-3-small No API key Local bge-small if enable_embedding=True Explicit enable_embedding=False No embeddings
Set OPENAI_API_KEY once in your environment and the SDK handles the rest. No need to pass enable_embedding=True or specify models.
Data Ingestion
put() - Add Single Document
mem.put(
'Document Title' , # title (required, positional)
'label' , # label (required, positional)
{}, # metadata dict (required, can be {})
# Content (one of these)
text = 'Document content...' ,
file = '/path/to/document.pdf' ,
# Optional
uri = 'mv2://docs/intro' ,
tags = [ 'api' , 'v2' ],
labels = [ 'public' , 'reviewed' ],
kind = 'markdown' ,
track = 'documentation' ,
# Embeddings
enable_embedding = True ,
embedding_model = 'bge-small' , # or 'openai', 'nomic', etc.
vector_compression = True , # 16x compression with PQ
# Behavior
auto_tag = True , # Auto-generate tags
extract_dates = True # Extract date mentions
)
put_many() - Batch Ingestion
docs = [
{ 'title' : 'Doc 1' , 'label' : 'kb' , 'text' : 'First document' },
{ 'title' : 'Doc 2' , 'label' : 'kb' , 'text' : 'Second document' },
{ 'title' : 'Doc 3' , 'label' : 'kb' , 'text' : 'Third document' }
]
frame_ids = mem.put_many(
docs,
embedder = openai_embeddings, # Custom embedder
opts = {
'compression_level' : 3 ,
'enable_embedding' : True ,
'embedding_model' : 'bge-small'
}
)
put_file() - Document Parsing
Ingest documents directly from files. Supports PDF , DOCX , XLSX , PPTX , and more. The SDK automatically extracts text content and creates searchable frames.
# Single file ingestion
frames = mem.put_file( '/path/to/report.pdf' )
print ( f 'Ingested { len (frames) } frames from PDF' )
# With options
frames = mem.put_file(
'/path/to/presentation.pptx' ,
chunk_size = 1000 , # Characters per chunk
chunk_overlap = 200 , # Overlap between chunks
enable_embedding = True , # Generate embeddings
embedding_model = 'bge-small'
)
# Excel/XLSX files
frames = mem.put_file( '/path/to/data.xlsx' )
# Each sheet becomes searchable content
# Word documents
frames = mem.put_file( '/path/to/document.docx' )
put_files() - Batch Document Ingestion
Ingest multiple documents at once:
files = [
'/path/to/report.pdf' ,
'/path/to/slides.pptx' ,
'/path/to/data.xlsx' ,
'/path/to/notes.docx'
]
all_frames = mem.put_files(
files,
chunk_size = 1000 ,
enable_embedding = True
)
print ( f 'Total frames: { len (all_frames) } ' )
Supported Formats:
PDF - Text extraction with page-aware chunking
DOCX - Microsoft Word documents
XLSX - Excel spreadsheets (all sheets, formulas evaluated)
PPTX - PowerPoint presentations (slide text and notes)
Required for document parsing: Install dependencies before using put_file():pip install memvid-sdk[documents]
# or install individually:
pip install pypdf openpyxl python-pptx python-docx
Without these, you’ll see errors like [memvid] pypdf/PyPDF2 not installed, PDF parsing unavailable.
For XLSX files with formulas, the SDK extracts the calculated values , not the formula text. This ensures searchable, meaningful content.
Search & Retrieval
find() - Hybrid Search
# Simple search
results = mem.find( 'budget projections' )
# With options
results = mem.find(
'financial outlook' ,
mode = 'auto' , # 'lex', 'sem', 'auto'
k = 10 , # Number of results
snippet_chars = 480 , # Snippet length
scope = 'track:meetings' , # Scope filter
# Access control (ACL)
# In "enforce" mode, tenant_id is required.
acl_context = { "tenant_id" : "tenant-123" , "roles" : [ "finance" ]},
acl_enforcement_mode = "enforce" ,
# Adaptive retrieval
adaptive = True ,
min_relevancy = 0.5 ,
max_k = 100 ,
adaptive_strategy = 'combined' , # 'relative', 'absolute', 'cliff', 'elbow'
# Time-travel
as_of_frame = 100 ,
as_of_ts = 1704067200 ,
# Custom embeddings
embedder = custom_embedder,
query_embedding_model = 'openai'
)
for hit in results[ 'hits' ]:
print (hit[ 'title' ], hit[ 'snippet' ])
Query Syntax: Multi-word queries use OR logic by default for better recall. Use AND for intersection: "machine AND learning". Use quotes for exact phrases: '"machine learning"'.
Permission-Aware Retrieval (ACL)
See Permission-Aware Retrieval (ACL) for the full model.
At a high level:
Write per-frame ACL metadata during ingestion (metadata["acl_*"])
Pass acl_context + acl_enforcement_mode="enforce" to find() / ask()
from memvid_sdk import get_acl_scope_from_api_key, acl_context_from_scope
scope = get_acl_scope_from_api_key()
acl_context = acl_context_from_scope(scope)
hits = mem.find(
"budget" ,
mode = "lex" ,
k = 5 ,
acl_context = acl_context,
acl_enforcement_mode = "enforce" ,
)[ "hits" ]
ask() - LLM Q&A
answer = mem.ask(
'What was decided about the budget?' ,
k = 8 ,
mode = 'auto' ,
# LLM settings
model = 'gpt-4o-mini' ,
api_key = os.environ[ 'OPENAI_API_KEY' ],
llm_context_chars = 120000 ,
# Privacy
mask_pii = True ,
# Time filters
since = 1704067200 ,
until = 1706745600 ,
# Options
context_only = False , # Set True to skip synthesis
# Adaptive retrieval
adaptive = True ,
min_relevancy = 0.5 ,
# Access control (ACL)
acl_context = { "tenant_id" : "tenant-123" , "roles" : [ "finance" ]},
acl_enforcement_mode = "enforce" ,
)
print (answer[ 'answer' ])
print (answer[ 'hits' ]) # Source documents
Grounding & Hallucination Detection
The ask() response includes a grounding object that measures how well the answer is supported by context:
answer = mem.ask(
'What is the API endpoint?' ,
model = 'gpt-4o-mini' ,
api_key = os.environ[ 'OPENAI_API_KEY' ]
)
# Check grounding quality
print (answer[ 'grounding' ])
# {
# 'score': 0.85,
# 'label': 'HIGH', # 'LOW', 'MEDIUM', or 'HIGH'
# 'sentence_count': 3,
# 'grounded_sentences': 3,
# 'has_warning': False,
# 'warning_reason': None
# }
# Check if follow-up is needed
follow_up = answer.get( 'follow_up' )
if follow_up and follow_up[ 'needed' ]:
print ( 'Low confidence:' , follow_up[ 'reason' ])
print ( 'Try these instead:' , follow_up[ 'suggestions' ])
Grounding Fields:
Field Type Description scorefloatGrounding score from 0.0 to 1.0 labelstrQuality label: LOW, MEDIUM, or HIGH sentence_countintSentences in the answer grounded_sentencesintSentences supported by context has_warningboolTrue if answer may be hallucinated warning_reasonstr?Explanation if warning is present
Follow-up Fields:
Field Type Description neededboolTrue if answer confidence is low reasonstrWhy confidence is low hintstrHelpful hint for the user available_topicslist[str]Topics in this memory suggestionslist[str]Suggested follow-up questions
correct() - Ground Truth Corrections
Store authoritative corrections that take priority in future retrievals:
# Store a correction
frame_id = mem.correct( 'Ben Koenig reported to Chloe Nguyen before 2025' )
# With options
frame_id = mem.correct(
'The API rate limit is 1000 req/min' ,
source = 'Engineering Team - Jan 2025' ,
topics = [ 'API' , 'rate limiting' ],
boost = 2.5 # Higher retrieval priority (default: 2.0)
)
# Batch corrections
frame_ids = mem.correct_many([
{ 'statement' : 'OAuth tokens expire after 24 hours' , 'topics' : [ 'auth' , 'OAuth' ]},
{ 'statement' : 'Production DB is db.prod.example.com' , 'source' : 'Ops Team' }
])
# Verify correction is retrievable
results = mem.find( 'Ben Koenig reported to' )
print (results[ 'hits' ][ 0 ][ 'snippet' ]) # Should show the correction
Use correct() to fix hallucinations or add verified facts. Corrections receive boosted retrieval scores and are labeled [Correction] in results.
Automatic Enrichment
# Extract facts using rules engine (fast, offline)
result = mem.enrich( engine = 'rules' )
# Extract with LLM (more accurate)
result = mem.enrich( engine = 'openai' )
# View extracted cards
memories = mem.memories()
print (memories[ 'cards' ])
# Filter by entity
alice_cards = mem.memories( entity = 'Alice' )
# Get entity state (O(1) lookup)
alice = mem.state( 'Alice' )
print (alice[ 'slots' ])
# {'employer': 'Anthropic', 'role': 'Engineer', 'location': 'SF'}
# Get stats
stats = mem.memories_stats()
print (stats[ 'entityCount' ], stats[ 'cardCount' ])
# List all entities
entities = mem.memory_entities()
Manual Memory Cards
# Add SPO triplets directly
result = mem.add_memory_cards([
{ 'entity' : 'Alice' , 'slot' : 'employer' , 'value' : 'Anthropic' },
{ 'entity' : 'Alice' , 'slot' : 'role' , 'value' : 'Senior Engineer' },
{ 'entity' : 'Bob' , 'slot' : 'team' , 'value' : 'Infrastructure' }
])
print (result[ 'added' ], result[ 'ids' ])
Export Facts
# Export to JSON
json_data = mem.export_facts( format = 'json' )
# Export to CSV
csv_data = mem.export_facts( format = 'csv' , entity = 'Alice' )
# Export to N-Triples (RDF)
ntriples = mem.export_facts( format = 'ntriples' )
# Extract tables from PDF
result = mem.put_pdf_tables( 'financial-report.pdf' , embed_rows = True )
print ( f "Extracted { result[ 'tables_count' ] } tables" )
# List all tables
tables = mem.list_tables()
for table in tables:
print (table[ 'table_id' ], table[ 'n_rows' ], table[ 'n_cols' ])
# Get table data
data = mem.get_table( 'tbl_001' , format = 'dict' )
csv_data = mem.get_table( 'tbl_001' , format = 'csv' )
Time-Travel & Sessions
Timeline Queries
timeline = mem.timeline(
limit = 50 ,
since = 1704067200 ,
until = 1706745600 ,
reverse = True ,
as_of_frame = 100
)
Session Recording
# Start recording
session_id = mem.session_start( 'qa-test' )
# Perform operations
mem.find( 'test query' )
mem.ask( 'What happened?' )
# Add checkpoint
mem.session_checkpoint()
# End session
summary = mem.session_end()
# List sessions
sessions = mem.session_list()
# Replay session with different params
replay = mem.session_replay(session_id, top_k = 10 , adaptive = True )
print (replay[ 'match_rate' ])
# Delete session
mem.session_delete(session_id)
Encryption & Security
from memvid_sdk import lock, unlock, lock_who, lock_nudge
# Encrypt to .mv2e capsule
encrypted_path = lock(
'project.mv2' ,
password = 'secret' ,
force = True
)
# Decrypt back to .mv2
decrypted_path = unlock(
'project.mv2e' ,
password = 'secret'
)
# Check who has the lock
lock_info = lock_who( 'project.mv2' )
# Nudge stale lock
released = lock_nudge( 'project.mv2' )
Tickets & Capacity
# Get current capacity
capacity = mem.get_capacity()
# Get current ticket info
ticket = mem.current_ticket()
# Sync tickets from dashboard
result = mem.sync_tickets( 'mem_abc123' , api_key)
# Apply ticket manually
mem.apply_ticket(ticket_string)
# Get memory binding
binding = mem.get_memory_binding()
# Unbind from dashboard
mem.unbind_memory()
Cloud Project & Memory Management
Programmatically create projects and memories on the Memvid dashboard, then bind local .mv2 files to them.
from memvid_sdk import configure
configure({
"api_key" : "mv2_your_api_key_here" ,
"dashboard_url" : "https://memvid.com"
})
Create and List Projects
from memvid_sdk import create_project, list_projects
# Create a new project
project = create_project(
"My AI Project" ,
description = "Knowledge base for my AI agent"
)
print ( f "Project ID: { project[ 'id' ] } " )
print ( f "Slug: { project[ 'slug' ] } " )
# List all projects
projects = list_projects()
for proj in projects:
print ( f " { proj[ 'name' ] } ( { proj[ 'id' ] } )" )
Project Response Fields:
Field Type Description idstrUnique project ID organisation_idstrOrganisation ID slugstrURL-friendly slug namestrProject name descriptionstr?Optional description created_atstrISO 8601 timestamp updated_atstrISO 8601 timestamp
Create and List Memories
from memvid_sdk import create_memory, list_memories
# Create a memory in a project
memory = create_memory(
"Agent Memory" ,
description = "Long-term memory for chatbot" ,
project_id = project[ "id" ]
)
print ( f "Memory ID: { memory[ 'id' ] } " )
print ( f "Display Name: { memory[ 'display_name' ] } " )
# List all memories
all_memories = list_memories()
# List memories in a specific project
project_memories = list_memories( project_id = project[ "id" ])
Bind Local File to Cloud Memory
from memvid_sdk import create
# Create local .mv2 file bound to cloud memory
mv = create( "./agent.mv2" , memory_id = memory[ "id" ])
mv.enable_lex() # Enable lexical search
# Add content
mv.put( title = "Meeting Notes" , label = "notes" , metadata = {}, text = "Today we discussed..." )
# Search
results = mv.find( "discussed" , k = 5 )
# Close
mv.seal()
Complete Example
import os
from memvid_sdk import configure, create_project, create_memory, create
# 1. Configure SDK
configure({ "api_key" : os.environ[ "MEMVID_API_KEY" ]})
# 2. Create project
project = create_project( "Knowledge Base" , description = "Company docs" )
# 3. Create cloud memory in project
memory = create_memory( "Docs Memory" , project_id = project[ "id" ])
# 4. Create local file bound to cloud memory
mv = create( "./docs.mv2" , memory_id = memory[ "id" ])
mv.enable_lex()
# 5. Add content
mv.put( title = "API Guide" , label = "docs" , metadata = {}, text = "API documentation..." )
mv.put( title = "FAQ" , label = "docs" , metadata = {}, text = "Frequently asked questions..." )
# 6. Search
results = mv.find( "API" , k = 5 )
print ( f "Found { len (results[ 'hits' ]) } results" )
# 7. Clean up
mv.seal()
Embedding Providers
External Providers
from memvid_sdk.embeddings import (
OpenAIEmbeddings,
GeminiEmbeddings,
MistralEmbeddings,
CohereEmbeddings,
VoyageEmbeddings,
NvidiaEmbeddings,
HuggingFaceEmbeddings,
get_embedder
)
# OpenAI
openai = OpenAIEmbeddings(
api_key = os.environ[ 'OPENAI_API_KEY' ],
model = 'text-embedding-3-small' # or 'text-embedding-3-large'
)
# Gemini
gemini = GeminiEmbeddings(
api_key = os.environ[ 'GEMINI_API_KEY' ],
model = 'text-embedding-004'
)
# Mistral
mistral = MistralEmbeddings(
api_key = os.environ[ 'MISTRAL_API_KEY' ]
)
# Cohere
cohere = CohereEmbeddings(
api_key = os.environ[ 'COHERE_API_KEY' ],
model = 'embed-english-v3.0'
)
# Voyage
voyage = VoyageEmbeddings(
api_key = os.environ[ 'VOYAGE_API_KEY' ],
model = 'voyage-3'
)
# NVIDIA
nvidia = NvidiaEmbeddings(
api_key = os.environ[ 'NVIDIA_API_KEY' ]
)
# HuggingFace (local)
hf = HuggingFaceEmbeddings( model = 'all-MiniLM-L6-v2' )
# Factory function
embedder = get_embedder( 'openai' , api_key = '...' )
# Use with put_many
mem.put_many(docs, embedder = openai)
# Use with find
mem.find( 'query' , embedder = gemini)
Local Embeddings (No API Required)
from memvid_sdk.embeddings import LOCAL_EMBEDDING_MODELS
mem.put(
'Title' , 'label' , {},
text = 'content' ,
enable_embedding = True ,
embedding_model = LOCAL_EMBEDDING_MODELS [ 'BGE_SMALL' ] # 384d, fast
)
# Available local models
LOCAL_EMBEDDING_MODELS [ 'BGE_SMALL' ] # 384d - fastest
LOCAL_EMBEDDING_MODELS [ 'BGE_BASE' ] # 768d - balanced
LOCAL_EMBEDDING_MODELS [ 'NOMIC' ] # 768d - general purpose
LOCAL_EMBEDDING_MODELS [ 'GTE_LARGE' ] # 1024d - highest quality
Error Handling
from memvid_sdk import (
MemvidError,
CapacityExceededError, # MV001
TicketInvalidError, # MV002
TicketReplayError, # MV003
LexIndexDisabledError, # MV004
TimeIndexMissingError, # MV005
VerifyFailedError, # MV006
LockedError, # MV007
ApiKeyRequiredError, # MV008
MemoryAlreadyBoundError, # MV009
FrameNotFoundError, # MV010
VecIndexDisabledError, # MV011
CorruptFileError, # MV012
VecDimensionMismatchError, # MV014
EmbeddingFailedError, # MV015
EncryptionError, # MV016
NerModelNotAvailableError, # MV017
ClipIndexDisabledError # MV018
)
try :
mem.put( 'Large file' , 'data' , {}, file = 'huge.bin' )
except CapacityExceededError:
print ( 'Storage capacity exceeded (MV001)' )
except LockedError:
print ( 'File locked by another process (MV007)' )
except VecIndexDisabledError:
print ( 'Enable vector index first (MV011)' )
# Get frame by URI
frame = mem.frame( 'mv2://docs/intro' )
# Get raw binary data
data = mem.blob( 'mv2://docs/intro' )
Utility Functions
from memvid_sdk import info, flush_analytics, is_telemetry_enabled, verify_single_file
# Get SDK info
sdk_info = info()
print (sdk_info[ 'version' ], sdk_info[ 'platform' ])
# Flush analytics
flush_analytics()
# Check telemetry status
enabled = is_telemetry_enabled()
# Verify no auxiliary files
verify_single_file( 'project.mv2' )
Environment Variables
Variable Description MEMVID_API_KEYDashboard API key for sync OPENAI_API_KEYOpenAI embeddings and LLM GEMINI_API_KEYGemini embeddings MISTRAL_API_KEYMistral embeddings COHERE_API_KEYCohere embeddings VOYAGE_API_KEYVoyage embeddings NVIDIA_API_KEYNVIDIA embeddings ANTHROPIC_API_KEYClaude for entities MEMVID_MODELS_DIRModel cache directory MEMVID_OFFLINEUse cached models only
Next Steps
Quickstart Build your first AI memory in 5 minutes
Embedding Providers Compare local and external embedding options
Framework Integrations LangChain, LlamaIndex, and more
Memory Cards O(1) entity lookups and fact extraction