Skip to main content

Endee vector database integration for CrewAI agent memory

Project description

crewai-endee

Endee vector database integration for CrewAI agent memory

crewai-endee connects Endee to CrewAI, giving your agents persistent memory with dense, hybrid, and filtered retrieval.


Installation

Requires Python 3.9+.

pip install crewai-endee

This installs endee, endee_model, crewai, and fastembed automatically.

Add your embedding provider (only install the one you use):

pip install cohere       # Cohere
pip install openai       # OpenAI
pip install google-genai # Google Gemini

Quick Start

from crewai_endee import EndeeVectorStore

store = EndeeVectorStore(
    type="my_index",
    embedder_config={"provider": "cohere", "config": {"model_name": "embed-english-light-v3.0"}},
)

store.save(value="Go is a statically typed language by Google.", metadata={"lang": "Go"})
results = store.search("static typing", limit=3)

Connect to Endee

First, configure your embedding provider:

embedder_config = {
    "provider": "cohere",
    "config": {"model_name": "embed-english-light-v3.0", "api_key": "YOUR_COHERE_API_KEY"},
}

With API token

Sign up at endee.io and get your token. See the Endee docs for details.

from crewai_endee import EndeeVectorStore

store = EndeeVectorStore(
    type="my_index",
    embedder_config=embedder_config,
    api_token="YOUR_ENDEE_API_TOKEN",
)

Without API token (local)

Run the open-source Endee server locally. See github.com/endee-io/endee for setup instructions. Then omit api_token:

store = EndeeVectorStore(
    type="my_index",
    embedder_config=embedder_config,
)

Dense Mode

from crewai_endee import EndeeVectorStore

store = EndeeVectorStore(
    type="demo_dense",
    embedder_config=embedder_config,
    api_token=ENDEE_API_TOKEN,
    space_type="cosine",
    precision="int8",
)

store.ensure_index()
store.save(value="Python is a dynamic language.", metadata={"lang": "Python"})
results = store.search("dynamic typing", limit=3)

Hybrid Mode

Add sparse_model_name to enable dense + sparse (BM25):

hybrid_store = EndeeVectorStore(
    type="demo_hybrid",
    embedder_config=embedder_config,
    api_token=ENDEE_API_TOKEN,
    sparse_model_name="endee/bm25",
)

hybrid_store.ensure_index()
hybrid_store.save(value="Go has native concurrency.", metadata={"lang": "Go"})

# Hybrid search — combines dense similarity with BM25 keyword matching
results = hybrid_store.search("concurrency", limit=3)

# Tune fusion weights (hybrid only)
results = hybrid_store.search("concurrency", limit=3, dense_rrf_weight=0.8, rrf_rank_constant=60)

Search with Filters

Endee uses MongoDB-style operator syntax for query filters:

# Filter by exact match
results = store.search("web language", limit=3, filter=[{"typing": {"$eq": "dynamic"}}])

# Filter with score threshold
results = store.search("systems programming", limit=3, filter=[{"typing": {"$eq": "static"}}], score_threshold=0.2)

# Include raw vectors in results
results = store.search("interpreted language", limit=1, include_vectors=True)

Supported operators: $eq, $ne, $gt, $gte, $lt, $lte, $in


Index Operations

# Describe index metadata (count, dimension, precision, etc.)
info = store.describe()

# Retrieve a single vector by ID
vec = store.get_vector("some_vector_id")

# Update filter metadata without re-embedding
store.update_filters([{"id": "some_vector_id", "filter": {"reviewed": "true"}}])

# Delete a single vector by ID
store.delete_vector("some_vector_id")

# Delete all vectors matching a filter
store.delete(filter=[{"category": {"$eq": "outdated"}}])

# Delete the entire index
store.reset()

CrewAI Integration

EndeeVectorStore extends CrewAI's RAGStorage. Wire it into a Crew via ShortTermMemory and EntityMemory:

from crewai import LLM, Agent, Crew, Process, Task
from crewai.memory.short_term.short_term_memory import ShortTermMemory
from crewai.memory.entity.entity_memory import EntityMemory
from crewai_endee import EndeeVectorStore

# Create Endee-backed stores for crew memory
stm_store = EndeeVectorStore(
    type="crew_short_term",
    embedder_config=embedder_config,
    api_token=ENDEE_API_TOKEN,
)

entity_store = EndeeVectorStore(
    type="crew_entity",
    embedder_config=embedder_config,
    api_token=ENDEE_API_TOKEN,
)

# Wrap as CrewAI memory objects
short_term_memory = ShortTermMemory(storage=stm_store)
entity_memory = EntityMemory(storage=entity_store)

# LLM + Agents
llm = LLM(model="gemini/gemini-2.5-flash", api_key=GOOGLE_API_KEY)

analyst = Agent(
    role="Software Analyst",
    goal="Extract programming language characteristics",
    backstory="You study programming language design and typing systems.",
    llm=llm,
)

# Tasks
analysis_task = Task(
    description="Analyse key characteristics of Python, Java, Go, Rust, and C++.",
    expected_output="Structured summary of each language.",
    agent=analyst,
)

# Crew with Endee-backed memory
crew = Crew(
    agents=[analyst],
    tasks=[analysis_task],
    process=Process.sequential,
    memory=True,
    short_term_memory=short_term_memory,
    entity_memory=entity_memory,
    embedder=embedder_config,
    verbose=True,
)

result = crew.kickoff()
print(result)

Supported Sparse Models

from crewai_endee import list_supported_models

for name, config in list_supported_models().items():
    print(f"  {name}{config['description']}")
Model Description
endee/bm25 BM25 sparse embeddings via endee_model
splade_pp SPLADE++ for English — semantic + keyword hybrid search

API Reference

Constructor Parameters

Parameter Type Default Description
type str (required) Unique Endee index name
embedder_config dict None Dense embedder config (provider, config)
api_token str None Endee API token (omit for local mode)
space_type str "cosine" Distance metric: cosine, l2, or ip
precision str server default float32, float16, int16, int8, or binary
sparse_model_name str None Set to enable hybrid mode (e.g. "endee/bm25")
ef_con int None HNSW ef_construction for index build quality
text_key str "value" Metadata key under which document text is stored
endee_index Index None Pre-existing endee.Index object
allow_reset bool True Whether reset() is permitted

Methods

Method Description
save(value, metadata) Embed text and upsert into the index
search(query, limit, filter, score_threshold, ...) Semantic search with optional filters
ensure_index() Create / verify the index and print status
describe() Return index metadata (count, dimension, precision, etc.)
get_vector(id) Retrieve a single vector by ID
delete_vector(id) Delete a single vector by ID
delete(filter) Delete all vectors matching a metadata filter
update_filters(updates) Update filter metadata without re-embedding
reset() Delete the entire index and reset state

Search Parameters

Parameter Default Description
query (required) Natural-language search query
limit 3 Max results (max 512)
filter None MongoDB-style filters: [{"field": {"$op": value}}]
score_threshold 0 Minimum similarity score to include
ef_search None HNSW ef parameter (default 128, max 1024)
include_vectors False Include raw vector data in results
dense_rrf_weight None Dense score weight in hybrid RRF fusion (0.0–1.0)
rrf_rank_constant None RRF constant k (default 60)

Interactive Demo

Open In Colab


Full Endee documentation: docs.endee.io | GitHub: endee-io/endee | CrewAI docs: docs.crewai.com

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crewai_endee-0.1.1b7.tar.gz (21.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

crewai_endee-0.1.1b7-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file crewai_endee-0.1.1b7.tar.gz.

File metadata

  • Download URL: crewai_endee-0.1.1b7.tar.gz
  • Upload date:
  • Size: 21.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for crewai_endee-0.1.1b7.tar.gz
Algorithm Hash digest
SHA256 60652c891f21fb29e9b504d12ee2b01c41d91b2778228f3bec339283ac5650f8
MD5 b9d9aa538eda1e75baaf4c905bc9571b
BLAKE2b-256 a4ecff97cd4ae5608498758461ae40ea30a7ec90b19c67f2da20f919881bee4d

See more details on using hashes here.

File details

Details for the file crewai_endee-0.1.1b7-py3-none-any.whl.

File metadata

  • Download URL: crewai_endee-0.1.1b7-py3-none-any.whl
  • Upload date:
  • Size: 11.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for crewai_endee-0.1.1b7-py3-none-any.whl
Algorithm Hash digest
SHA256 f57f4afcffe2b3f3d8815eeeb2401eeb474870a8b7fdd0c720b648034ae27464
MD5 aa80c61aed72c04f18521d8d61832f34
BLAKE2b-256 b6101d1129c4a6241c722ab80cd4376abd7ff0b36ebdd41b3bbcc0508d39355a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page