Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/memory/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,18 @@ def _create_embedding_provider(self) -> EmbeddingProvider:
model=self.config.embedding.model,
base_url=self.config.embedding.base_url or "http://localhost:11434",
)
elif provider == "llama":
from memory.embeddings.llama import LlamaEmbedding
return LlamaEmbedding(
model=self.config.embedding.model,
base_url=self.config.embedding.base_url or "http://localhost:11435",
)
elif provider == "llama-nomic":
from memory.embeddings.llama_nomic import LlamaNomicEmbedding
return LlamaNomicEmbedding(
model=self.config.embedding.model,
base_url=self.config.embedding.base_url or "http://localhost:11435",
)
elif provider == "openai":
from memory.embeddings.openai_embed import OpenAIEmbedding
return OpenAIEmbedding(
Expand Down
4 changes: 4 additions & 0 deletions src/memory/embeddings/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from memory.embeddings.base import EmbeddingProvider
from memory.embeddings.ollama import OllamaEmbedding
from memory.embeddings.openai_embed import OpenAIEmbedding
from memory.embeddings.llama import LlamaEmbedding
from memory.embeddings.llama_nomic import LlamaNomicEmbedding

__all__ = [
"EmbeddingProvider",
"OllamaEmbedding",
"OpenAIEmbedding",
"LlamaEmbedding",
"LlamaNomicEmbedding"
]
4 changes: 4 additions & 0 deletions src/memory/embeddings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,9 @@ class EmbeddingProvider(ABC):
def embed(self, text: str) -> list[float]:
...

@abstractmethod
def search(self, text: str) -> list[float]:
...

def embed_batch(self, texts: list[str]) -> list[list[float]]:
return [self.embed(t) for t in texts]
27 changes: 27 additions & 0 deletions src/memory/embeddings/llama.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import httpx
from memory.embeddings.base import EmbeddingProvider


class LlamaEmbedding(EmbeddingProvider):
def __init__(self, model: str = "text-embedder",
base_url: str = "http://localhost:11435"):
self.model = model
self.base_url = base_url

def embed(self, text: str) -> list[float]:
resp = httpx.post(
f"{self.base_url}/embeddings",
json={"model": self.model, "content": text},
timeout=30.0,
)
resp.raise_for_status()
return resp.json()[0]["embedding"][0]

def search(self, text: str) -> list[float]:
resp = httpx.post(
f"{self.base_url}/embeddings",
json={"model": self.model, "content": text},
timeout=30.0,
)
resp.raise_for_status()
return resp.json()[0]["embedding"][0]
27 changes: 27 additions & 0 deletions src/memory/embeddings/llama_nomic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import httpx
from memory.embeddings.base import EmbeddingProvider


class LlamaNomicEmbedding(EmbeddingProvider):
def __init__(self, model: str = "text-embedder",
base_url: str = "http://localhost:11435"):
self.model = model
self.base_url = base_url

def embed(self, text: str) -> list[float]:
resp = httpx.post(
f"{self.base_url}/embeddings",
json={"model": self.model, "content": 'search_document: ' + text},
timeout=30.0,
)
resp.raise_for_status()
return resp.json()[0]["embedding"][0]

def search(self, text: str) -> list[float]:
resp = httpx.post(
f"{self.base_url}/embeddings",
json={"model": self.model, "content": 'search_query: ' + text},
timeout=30.0,
)
resp.raise_for_status()
return resp.json()[0]["embedding"][0]
2 changes: 2 additions & 0 deletions src/memory/embeddings/ollama.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,5 @@ def embed(self, text: str) -> list[float]:
)
resp.raise_for_status()
return resp.json()["embedding"]

search = embed
2 changes: 2 additions & 0 deletions src/memory/embeddings/openai_embed.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ def embed(self, text: str) -> list[float]:
)
resp.raise_for_status()
return resp.json()["data"][0]["embedding"]

search = embed
4 changes: 2 additions & 2 deletions src/memory/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def tiered_search(

# FTS results are sparse — fall back to hybrid (embed + vector search + merge)
try:
query_vec = embedding_provider.embed(query)
query_vec = embedding_provider.search(query)
vec_results = db.vector_search(
query_vec, limit=limit * 2, project=project, source=source
)
Expand Down Expand Up @@ -144,7 +144,7 @@ def hybrid_search(
r["score"] = r["score"] / max_score if max_score > 0 else 0.0
return fts_results[:limit]

query_vec = embedding_provider.embed(query)
query_vec = embedding_provider.search(query)
vec_results = db.vector_search(
query_vec, limit=limit * 2, project=project, source=source
)
Expand Down