Embedded vector database + living context engine — multimodal pockets, context graph, adaptive decay, MCP server
Project description
Feather DB
Embedded vector database + self-aligned context engine
Part of Hawky.ai — AI-Native Development Tools
Feather DB is an embedded vector database and living context engine — zero-server, file-based, with a built-in knowledge graph, adaptive memory decay, LLM agent connectors, and a self-aligned ingestion engine that organises data automatically.
What's New in v0.13–v0.15 — Ingestion, Memory & Claude (Phase 8)
| Capability | Version | Notes |
|---|---|---|
| Persisted HNSW graph | v0.16.0 | save() embeds the prebuilt graph (file format v9) so load() restores it instead of rebuilding — 5–25× faster cold load (48 ms vs 2.7s/13.4s on 40k×128 clustered) and deterministic serial-build recall (0.988). Falls back to rebuild for dirty DBs / old files; ~25% larger files. |
| Adaptive index capacity | v0.15.3 | HNSW indices start at 4096 elements and grow via resizeIndex() on demand instead of preallocating 1M — ~7.7× less RAM for many-namespace deployments (709→92 MB across 19 namespaces), no hard cap. |
| Parallel HNSW load | v0.13.0 | Graph rebuilt across a thread pool on open — ~4.7× faster load (7.6s→1.7s for 40k×128), identical recall. FEATHER_LOAD_THREADS to cap. Still used for old files / DBs with pending deletions. |
| Parallel batch ingest | v0.13.0 | DB.add_batch(ids, vecs, metas=None) builds the graph in parallel with the GIL released — ~3.4× faster bulk insert. |
| SIMD on x86 | v0.13.0 | SSE/AVX L2 kernels (runtime-dispatched) compiled on x86_64; arm64 uses -O3 NEON. FEATHER_SIMD=none|sse|avx|avx512. |
| In-RAM int8 quantization | v0.15.0 | set_int8_ram(modality, max_abs) stores vectors as int8 in memory — ~1.7× less RAM (227→129 MB at 60k×768), recall ~0.88. File format v8. |
| MCP connector for Claude | v0.14.0 | feather-serve exposes Feather as a persona context engine to Claude Desktop / Code — local .feather or remote Cloud API (--api-url). |
| Real embedders | v0.15.1 | feather-serve --embed-provider gemini|openai|voyage|cohere|ollama — semantic recall over a hosted instance (Gemini text-embedding-004 = native 768). |
# Bulk-ingest a persona's history fast (parallel HNSW build)
db.add_batch(ids, vecs, metas)
# Store vectors as int8 in RAM — ~1.7x less memory (opt-in, lossy)
db.set_int8_ram("text", max_abs=1.0)
# Claude Code → hosted Feather as a persona context engine (real embeddings)
GOOGLE_API_KEY=… claude mcp add feather -- feather-serve \
--api-url http://HOST:8000 --namespace persona --dim 768 --embed-provider gemini
What's New in v0.11–v0.12 — Query Performance & Compression (Phase 7)
| Capability | Version | Notes |
|---|---|---|
| Secondary metadata indexes | v0.11.0 | Inverted indexes on namespace_id / entity_id / attributes — namespace & attribute lookups go from O(n) scans to O(matches). New DB methods: ids_in_namespace, ids_for_entity, ids_with_attribute, namespace_size, list_namespaces. |
| Pre-filtered ANN search | v0.11.0 | search(filter=…) with a namespace/entity/attribute constraint now ranks exactly over the indexed candidate set, returning a complete top-k instead of HNSW's ef-bounded under-return — and is O(matches), so selective filters are faster. |
| Incremental auto-compaction | v0.11.0 | set_auto_compact(ratio) rebuilds a modality index once its deleted/total ratio crosses a threshold, reclaiming forget()/purge()'d vectors automatically. compact() also fixed to reclaim forgotten records and never resurrect purged ones. |
| On-disk int8 quantization | v0.12.0 | set_quantized(modality) persists vectors as int8 + per-vector scale (file format v7) — ~2.5–4× smaller .feather files, dequantized to float32 on load (search unchanged). |
# Pre-filtered exact search — reliably returns a full k even under a selective filter
f = FilterBuilder().namespace("acme").attribute("channel", "instagram").build()
results = db.search(query_vec, k=10, filter=f) # complete top-10, exact ranking
# Auto-compaction — reclaim deleted vectors past 20% dead
db.set_auto_compact(0.2)
# int8 on-disk compression — ~3x smaller files, opt-in per modality
db.set_quantized("text", True)
db.save() # persisted as int8 (format v7)
Scope note: int8 quantization reduces disk footprint and load I/O; the in-memory HNSW index remains float32. In-RAM int8 indexing is a future step.
What's New in v0.10 — Feather DB Cloud Edition
The feather-api/ package now ships a production-ready admin SPA + a
pluggable embedding service, so you can run Feather as a managed context
engine for downstream consumers (e.g. brand teams, agents, internal tools).
| Capability | Where | Notes |
|---|---|---|
| Atlas-style admin SPA | /admin/ route on the FastAPI server |
Custom HTML + Tailwind + Alpine.js, brand-aligned, zero build step |
| Pluggable embeddings | Settings → Embedding service | OpenAI · Azure OpenAI · Gemini · Voyage · Cohere · Ollama with curated model dropdowns |
| Ingest text | POST /v1/{ns}/ingest_text |
Server embeds via the configured provider, then stores — single call |
| Bulk import | POST /v1/{ns}/import |
Paste a JSON array of {id, vector, metadata} |
| Hierarchy navigator | Namespace detail → Hierarchy tab | Brand → Channel → Campaign → AdSet → Ad → Creative tree from metadata.attributes |
| Marketing profile card | Record drawer | Auto-renders KPIs (CTR, ROAS, channel) when present |
| Cmd-K palette | Press ⌘K / Ctrl+K | Fuzzy search namespaces · id:123 to open a record · /seed, /import actions |
| Live observability | Overview screen | p50 / p95 / p99 latency, ops-per-minute sparkline, recent activity feed |
| Delete + purge + compact | Namespace header buttons | Per-record DELETE, bulk PURGE by namespace_id, COMPACT to reclaim |
| Schema discovery | Namespace detail → Schema tab | Distinct attribute keys + type inference + sample values |
| Connection panel | Settings → Connection | Copy-paste cURL / Python / JS snippets pre-filled with your URL |
See docs/quickstart.md for a self-hosted setup walkthrough.
Deployment note:
feather-api/runs single-tenant with one sharedFEATHER_API_KEY. Multi-tenant key isolation + HTTPS are on the roadmap.
What's Inside
| Capability | Description |
|---|---|
| ANN Search | Sub-millisecond approximate nearest-neighbor search via HNSW |
| Multimodal Pockets | Text, image, audio vectors per entity under a single ID |
| Context Graph | Typed + weighted edges, reverse index, auto-link by similarity |
| Context Chain | One call: vector search + n-hop BFS graph expansion |
| Living Context | Recall-count stickiness — frequently accessed items resist temporal decay |
| Namespace / Entity / Attributes | Generic partition + subject + KV metadata for any domain |
| Graph Visualizer | Self-contained D3 force-graph HTML — fully offline, no CDN |
| LLM Agent Connectors | Claude, OpenAI, Gemini tool-use/function-calling with 14 Feather tools |
| MCP Server | feather-serve — connects Feather to Claude Desktop, Cursor, and any MCP client |
| LangChain / LlamaIndex | Drop-in FeatherVectorStore, FeatherMemory, FeatherRetriever adapters |
| Self-Aligned Context Engine | LLM-powered ingestion: auto-classifies, scores, links, and namespaces every record |
| Single-file persistence | .feather binary format (v9, persisted HNSW graph for fast cold load + optional int8 compression on-disk and in-RAM); v3–v8 files load transparently |
Installation
pip install feather-db # core
pip install "feather-db[all]" # + langchain, llamaindex, mcp extras
CLI (Rust):
cargo install feather-db-cli
Build from source:
git clone https://github.com/feather-store/feather
cd feather
python setup.py build_ext --inplace
Quick Start
import feather_db
import numpy as np
# Open or create a database
db = feather_db.DB.open("context.feather", dim=768)
# Add a vector with metadata
meta = feather_db.Metadata()
meta.content = "User prefers dark mode"
meta.importance = 0.9
db.add(id=1, vec=np.random.rand(768).astype(np.float32), meta=meta)
# Semantic search
results = db.search(np.random.rand(768).astype(np.float32), k=5)
for r in results:
print(r.id, r.score, r.metadata.content)
db.save()
Self-Aligned Context Engine (v0.7.0)
The ContextEngine wraps DB with an LLM-powered ingestion pipeline. Drop in any text — the engine classifies it, scores it, links it to related records, and stores it in the right namespace. No schema to define upfront.
from feather_db import ContextEngine, ClaudeProvider
import numpy as np, hashlib
def embed(text: str) -> np.ndarray:
# replace with your real embedder
vec = np.zeros(768, dtype=np.float32)
for i, tok in enumerate(text.split()[:768]):
vec[i % 768] += 1.0
n = np.linalg.norm(vec)
return vec / n if n > 0 else vec
engine = ContextEngine(
db_path = "knowledge.feather",
dim = 768,
provider = ClaudeProvider(), # or OpenAIProvider, GeminiProvider, OllamaProvider, None
embedder = embed,
namespace = "myapp",
)
nid = engine.ingest(
"Competitor X launched a developer SDK with MIT license — 10k GitHub stars in 24 hours."
)
The engine automatically:
- Classifies entity type (
competitor_intel,user_feedback,strategy_brief, …) - Scores importance (0–1) and confidence (0–1)
- Assigns TTL and namespace
- Suggests and creates graph edges to related records
Works offline too — pass provider=None for a built-in heuristic classifier (no API key needed):
engine = ContextEngine(db_path="k.feather", dim=768, provider=None, embedder=embed)
Supported Providers
from feather_db import ClaudeProvider, OpenAIProvider, OllamaProvider, GeminiProvider
ClaudeProvider(model="claude-haiku-4-5-20251001") # Anthropic
OpenAIProvider(model="gpt-4o-mini") # OpenAI
OpenAIProvider(model="llama-3.3-70b-versatile", # Groq
base_url="https://api.groq.com/openai/v1",
api_key=GROQ_KEY)
OllamaProvider(model="llama3.1:8b") # Ollama (local, no key)
GeminiProvider(model="gemini-2.0-flash") # Google Gemini
All providers share the same LLMProvider interface — swap at any time without changing the rest of your code.
LLM Agent Connectors (v0.6.0)
Give any LLM agent native access to Feather DB via 14 built-in tools.
Claude (tool_use)
import anthropic
from feather_db import ClaudeConnector
connector = ClaudeConnector(db=db, embedder=embed)
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "What competitor moves should I watch?"}]
reply = connector.run_loop(client, messages, model="claude-opus-4-6")
print(reply)
OpenAI / Groq / vLLM (function_calling)
from openai import OpenAI
from feather_db import OpenAIConnector
connector = OpenAIConnector(db=db, embedder=embed)
client = OpenAI()
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Find records about onboarding friction"}],
tools=connector.tools(),
)
result = connector.handle(resp.choices[0].message.tool_calls[0].function.name,
resp.choices[0].message.tool_calls[0].function.arguments)
Available Tools (14)
| Tool | Description |
|---|---|
feather_search |
Semantic vector search |
feather_context_chain |
Vector search + graph BFS expansion |
feather_get_node |
Retrieve a single record by ID |
feather_get_related |
Get all graph-linked records |
feather_add_intel |
Store a new record with metadata |
feather_link_nodes |
Create a typed weighted edge |
feather_timeline |
Time-ordered records in a range |
feather_forget |
Drop a record by ID |
feather_health |
Database health report |
feather_why |
Explain why a record was retrieved |
feather_mmr_search |
Maximal marginal relevance search |
feather_consolidate |
Merge near-duplicate records |
feather_episode_get |
Retrieve an episode by ID |
feather_expire |
Purge records past their TTL |
MCP Server (v0.6.0)
Connect Feather DB to Claude Desktop, Cursor, or any MCP-compatible client:
pip install "feather-db[mcp]"
feather-serve --db knowledge.feather --dim 768
Add to claude_desktop_config.json:
{
"mcpServers": {
"feather": {
"command": "feather-serve",
"args": ["--db", "/path/to/knowledge.feather", "--dim", "768"]
}
}
}
All 14 tools become available to Claude Desktop immediately — no code required.
LangChain Integration (v0.6.0)
from feather_db.integrations import FeatherVectorStore, FeatherMemory, FeatherRetriever
# Drop-in VectorStore
store = FeatherVectorStore(db=db, embedder=embed)
retriever = store.as_retriever(search_kwargs={"k": 5})
# Semantic conversation memory with adaptive decay
memory = FeatherMemory(db=db, embedder=embed, k=5)
# context_chain retriever
retriever = FeatherRetriever(db=db, embedder=embed, k=5, hops=2)
LlamaIndex Integration (v0.6.0)
from feather_db.integrations import FeatherVectorStoreIndex, FeatherReader
# Index documents
index = FeatherVectorStoreIndex.from_documents(documents, db=db, embed_model=embed_model)
query_engine = index.as_query_engine()
response = query_engine.query("What is our retention strategy?")
# Load existing Feather DB as LlamaIndex Documents
reader = FeatherReader(db=db)
docs = reader.load_data()
Core Features
Multimodal Pockets
Each named modality gets its own independent HNSW index and dimensionality. A single entity ID can hold text, visual, and audio vectors simultaneously.
db.add(id=42, vec=text_vec, modality="text") # 768-dim
db.add(id=42, vec=image_vec, modality="visual") # 512-dim
db.add(id=42, vec=audio_vec, modality="audio") # 256-dim
results = db.search(query_vec, k=10, modality="visual")
Context Graph
Typed, weighted edges between records. Nine built-in relationship types plus free-form strings.
from feather_db import RelType
db.link(from_id=1, to_id=2, rel_type=RelType.CAUSED_BY, weight=0.9)
db.link(from_id=1, to_id=3, rel_type=RelType.SUPPORTS, weight=0.7)
edges = db.get_edges(1) # outgoing edges
incoming = db.get_incoming(2) # reverse index
db.auto_link(modality="text", threshold=0.85, rel_type=RelType.RELATED_TO)
Built-in types: related_to, derived_from, caused_by, contradicts, supports, precedes, part_of, references, multimodal_of.
Context Chain
One call that combines semantic search with n-hop BFS graph traversal:
result = db.context_chain(query=query_vec, k=5, hops=2, modality="text")
for node in result.nodes:
print(node.id, node.score, node.hop_distance)
for edge in result.edges:
print(edge.source_id, "->", edge.target_id, edge.rel_type)
Filtered Search
from feather_db import FilterBuilder
results = db.search(
query_vec, k=10,
filter=FilterBuilder()
.namespace("acme")
.entity("user_123")
.attribute("channel", "instagram")
.importance_gte(0.5)
.build()
)
When the filter constrains a namespace, entity, or attribute, Feather
resolves the candidate set from its secondary indexes and ranks exactly over
just those vectors — so a selective filter returns a complete top-k (no
ef-bounded under-return) and runs in O(matches).
Living Context / Adaptive Decay
from feather_db import ScoringConfig
cfg = ScoringConfig(half_life=30.0, weight=0.3, min=0.0)
results = db.search(query_vec, k=10, scoring=cfg)
Formula:
stickiness = 1 + log(1 + recall_count)
effective_age = age_in_days / stickiness
recency = 0.5 ^ (effective_age / half_life_days)
final_score = ((1 - time_weight) * similarity + time_weight * recency) * importance
touch() is called automatically on every search hit.
Memory Layer (v0.6.0)
from feather_db import MemoryManager
mm = MemoryManager(db)
print(mm.health_report()) # cluster stats + stale records
diverse = mm.search_mmr(vec, k=10) # maximal marginal relevance
mm.consolidate(threshold=0.95) # merge near-duplicate records
mm.assign_tiers() # hot / warm / cold tiering by recall_count
Episodes (v0.6.0)
Group related records into named episodes:
from feather_db import EpisodeManager
em = EpisodeManager(db)
eid = em.begin_episode("onboarding_analysis")
em.add_to_episode(eid, node_id)
ep = em.get_episode(eid)
em.close_episode(eid)
Triggers & Contradiction Detection (v0.6.0)
from feather_db import WatchManager, ContradictionDetector
wm = WatchManager(db)
wm.watch(namespace="acme", callback=lambda record: print("New:", record.content))
cd = ContradictionDetector(db)
conflicts = cd.check(new_meta) # returns list of conflicting record IDs
Namespace / Entity / Attributes
meta = feather_db.Metadata()
meta.namespace_id = "acme"
meta.entity_id = "user_123"
meta.set_attribute("channel", "instagram") # use this, NOT meta.attributes['k'] = v
val = meta.get_attribute("channel")
Domain profiles for typed helpers:
from feather_db import MarketingProfile
p = MarketingProfile()
p.set_brand("nike")
p.set_user("user_8821")
p.set_channel("instagram")
p.set_ctr(0.045)
meta = p.to_metadata()
Graph Visualization
from feather_db.graph import visualize, export_graph
visualize(db, output_path="/tmp/graph.html") # self-contained D3 HTML
data = export_graph(db, namespace_filter="nike") # Python dict for D3/Cytoscape
Rust CLI
feather add --db my.feather --id 1 --vec "0.1,0.2,0.3" --modality text
feather search --db my.feather --vec "0.1,0.2,0.3" --k 5
feather link --db my.feather --from 1 --to 2
feather save --db my.feather
Performance
| Metric | Value |
|---|---|
| Add rate | 2,000–5,000 vectors/sec |
| Search latency p50 (k=10, 500K × 128-dim, real SIFT data) | 0.19 ms |
| Search latency p99 (k=10, 500K × 128-dim, real SIFT data) | 0.13 ms @ ef=10, 1.03 ms @ ef=200 |
| Recall@10 (500K × 128-dim, ef=50, real SIFT) | 0.972 |
| Max vectors per modality | unbounded — capacity grows adaptively (starts 4096) |
| HNSW params | M=16, ef_construction=200, ef=50 (default in v0.8.0) |
| File format | Binary .feather v9 (persisted HNSW graph: 5–25× faster cold load; optional int8: ~3× smaller on disk, ~1.7× less RAM) |
SIMD (AVX2/AVX512) optimizations are available in space_l2.h. Enable with -DUSE_AVX -march=native in setup.py.
Reproducible benchmark harness lives in bench/. Run any benchmark with python -m bench run <scenario>.
Benchmarks
Memory benchmark — LongMemEval (Xu et al., 2024)
500-question end-to-end memory QA benchmark, the standard for long-term memory in chat assistants. Full report: docs/benchmarks/longmemeval.md.
| Run | Variant | Answerer | Overall | Notes |
|---|---|---|---|---|
| Feather DB v0.8.0 + decay | S | gpt-4o | 0.693 | best run; same model as Supermemory |
| Feather DB v0.8.0 + decay | S | gemini-2.5-flash | 0.657 | cheap-tier; ~$2.40 per full run |
| Feather DB v0.8.0 + decay | oracle | gemini-2.5-flash | 0.670 | retrieval-easy ceiling |
| System | Variant | Answerer | Overall |
|---|---|---|---|
| Feather DB v0.8.0 + decay | S | gemini-2.5-flash | 0.657 |
| Zep (graphiti) | S | gpt-4o-mini | 0.638 |
| Full-context GPT-4o (paper "ceiling") | S | gpt-4o + CoN | 0.640 |
| Full-context GPT-4o-mini | S | gpt-4o-mini | 0.554 |
| Mem0 (prior algo) | S | gpt-4o-mini | 0.678 |
| Supermemory | S | gpt-4o | 0.816 |
Cost for the full Feather S run: ~$2.40 (Azure embeddings + Gemini answer + judge). Wall time 4.5 hours. 5 failures / 500 questions.
Reproduce:
python -m bench run longmemeval --dataset s --limit 0 \
--embedder openai --judge llm \
--judge-provider gemini --judge-model gemini-2.0-flash \
--answerer-provider gemini --answerer-model gemini-2.5-flash \
--decay-half-life 14 --decay-time-weight 0.4 --k 10
ANN benchmark — SIFT1M
Standard ANN benchmark. Full sweep results in bench/results/.
| Config | p50 | p99 | Recall@10 |
|---|---|---|---|
| 500K × 128, ef=10 | 0.07 ms | 0.13 ms | 0.774 |
| 500K × 128, ef=50 (default) | 0.19 ms | 0.23 ms | 0.972 |
| 500K × 128, ef=200 | 0.56 ms | 0.69 ms | 0.998 |
Cloud Deployment (Azure / Docker)
Feather DB ships with a production-ready FastAPI wrapper and the Atlas-style admin SPA (custom HTML + Tailwind + Alpine.js — no build step) you can deploy on any Linux VM.
git clone https://github.com/feather-store/feather.git
cd feather
FEATHER_API_KEY="feather-$(openssl rand -hex 16)" \
docker compose -f feather-api/docker-compose.yml up -d --build
| URL | Description |
|---|---|
http://<VM_IP>:8000/health |
Health check |
http://<VM_IP>:8000/docs |
Swagger / OpenAPI |
http://<VM_IP>:8000/admin/ |
Admin SPA — namespaces, search, graph, embedding settings |
Self-hosted walkthrough → docs/quickstart.md ·
Azure guide → docs/deploy-azure.md
Data is stored in a Docker named volume (
feather-data → /data) and persists across restarts and rebuilds.
Examples
| File | Description |
|---|---|
examples/context_engine_demo.py |
Self-Aligned Context Engine — all four providers + heuristic fallback |
examples/context_graph_demo.py |
Context graph — auto-link, context_chain, D3 HTML export |
examples/marketing_living_context.py |
Multi-brand namespace/entity/attribute filtering |
examples/feather_inspector.py |
Local HTTP inspector — force graph, PCA scatter, edit, delete |
Run:
python setup.py build_ext --inplace
python3 examples/context_engine_demo.py
# With a provider:
ANTHROPIC_API_KEY=sk-ant-... python3 examples/context_engine_demo.py
OLLAMA_MODEL=mistral:7b python3 examples/context_engine_demo.py
Architecture
[Generic Core — C++17]
feather::DB
├── modality_indices_ (unordered_map<string, ModalityIndex>) — one HNSW per modality
├── metadata_store_ (unordered_map<uint64_t, Metadata>) — shared metadata by ID
└── Methods: add, search, link, context_chain, auto_link, export_graph_json, …
[Python Layer — feather_db]
├── DB, Metadata, ContextType, ScoringConfig
├── Edge, IncomingEdge, ContextNode, ContextEdge, ContextChainResult
├── FilterBuilder — fluent search filter helper
├── DomainProfile — generic namespace/entity/attributes base class
├── MarketingProfile — digital marketing typed adapter
├── RelType — standard relationship type constants
├── graph.visualize() — D3 force-graph HTML exporter
├── MemoryManager — health reports, MMR, consolidate, tiering
├── WatchManager — namespace/entity watch callbacks
├── ContradictionDetector — conflict detection on ingest
├── EpisodeManager — grouped episode records
├── merge() — merge two .feather files
├── LLMProvider / ClaudeProvider / OpenAIProvider / OllamaProvider / GeminiProvider
├── ContextEngine — self-aligned LLM-powered ingestion pipeline
└── integrations/
├── ClaudeConnector — Claude tool_use with 14 Feather tools
├── OpenAIConnector — OpenAI/Groq/Mistral function_calling
├── GeminiConnector — Gemini function_calling + GeminiEmbedder
├── FeatherVectorStore / FeatherMemory / FeatherRetriever (LangChain)
├── FeatherVectorStoreIndex / FeatherReader (LlamaIndex)
└── mcp_server — feather-serve MCP endpoint
[Rust CLI]
feather-db-cli (FFI via extern "C" from src/feather_core.cpp)
File Format
[magic: 4B = "FEAT"] [version: 4B = 8]
--- Metadata Section ---
[meta_count: 4B]
for each record:
[id: 8B] [serialized Metadata including namespace/entity/attributes/edges]
--- Modality Indices Section ---
[modal_count: 4B]
for each modality:
[name_len: 2B] [name: N bytes]
[dim: 4B] [quantized: 1B] # on-disk int8 flag (v7+)
[int8_ram: 1B] [scale: 4B if int8_ram] # in-RAM int8 flag + global scale (v8+)
[persist_graph: 1B] # v9: 1 → prebuilt HNSW graph blob follows
if persist_graph: # fast cold load — no rebuild
[HNSW graph: header + base layer (vectors) + per-element link lists]
else:
[element_count: 4B]
for each element:
[id: 8B] then, per `quantized`:
0 → [float32 vector: dim * 4 bytes]
1 → [scale: 4B float] [int8 vector: dim bytes]
v3–v8 files load transparently (the quantized flag is read for v7+, the
int8_ram flag for v8+, the persist_graph flag for v9+); missing fields
default to empty. The graph is persisted only for a clean, non-on-disk-quantized
modality; otherwise load rebuilds it (parallel).
Known Limitations
| Issue | Detail |
|---|---|
| No concurrent writes | HNSW is not thread-safe for simultaneous adds |
| Soft deletes reclaimed on compaction | forget()/purge() mark vectors deleted; space is reclaimed by compact() or set_auto_compact(ratio) |
| int8 quantization (two kinds) | set_quantized() = smaller files; set_int8_ram() = ~1.7× less RAM (opt-in, lossy) |
| Index capacity | Adaptive (v0.15.3): starts at 4096, grows via resizeIndex on demand — no hard cap, RAM tracks the working set |
meta.attributes['k'] = v silent no-op |
pybind11 map copy; use meta.set_attribute(k, v) |
| Rust CLI missing v0.6.0+ features | namespace/entity/context_chain/integrations are Python-only |
Contributing
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Submit a pull request
License
MIT — see LICENSE
Acknowledgments
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file feather_db-0.16.0.tar.gz.
File metadata
- Download URL: feather_db-0.16.0.tar.gz
- Upload date:
- Size: 426.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
086d4a426ea317b636fb802d8b2cd322b3183103ea3627866cc4e7a5d3a33162
|
|
| MD5 |
d88a26041443588705e474b84e6a81ef
|
|
| BLAKE2b-256 |
59dbd9f8e46d03c617f61ab74d558ceb74fcc030c8078dd2c43a39d4cd46a7cc
|