Skip to content

Commit a77de68

Browse files
authored
Merge branch 'main' into feat/pipecat-voice-integration
2 parents d026b91 + 1692c98 commit a77de68

5 files changed

Lines changed: 410 additions & 13 deletions

File tree

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,21 @@ v = Vektori(embedding_model="bge:BAAI/bge-m3")
321321
v = Vektori(extraction_model="litellm:groq/llama3-8b-8192")
322322
```
323323

324+
## NVIDIA NIM - GPU-optimized models via [NVIDIA NIM](https://build.nvidia.com).
325+
```python
326+
# NVIDIA embedding models (Matryoshka: 384-2048 dimensions)
327+
v = Vektori(
328+
embedding_model="nvidia:llama-nemotron-embed-1b-v2",
329+
embedding_dimension=1024, # Optional: 384, 512, 768, 1024, or 2048
330+
)
331+
332+
# NVIDIA LLM models (nvidia/ prefix auto-added)
333+
v = Vektori(extraction_model="nvidia:llama-3.3-nemotron-super-49b-v1")
334+
335+
# Third-party models hosted on NVIDIA NIM (use full path)
336+
v = Vektori(extraction_model="nvidia:z-ai/glm5")
337+
338+
```
324339
---
325340

326341
## Why Not Mem0 / Zep?

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ sentence-transformers = ["sentence-transformers>=2.6"]
4242
bge = ["FlagEmbedding>=1.2"]
4343
litellm = ["litellm>=1.30"]
4444
pipecat = ["pipecat-ai>=0.0.50", "fastapi>=0.110", "uvicorn[standard]>=0.29"]
45+
nvidia = ["openai>=1.12"] # NVIDIA NIM uses OpenAI-compatible API
4546
dev = [
4647
"pytest>=8.0",
4748
"pytest-asyncio>=0.23",
@@ -60,6 +61,7 @@ all = [
6061
"sentence-transformers>=2.6",
6162
"FlagEmbedding>=1.2",
6263
"litellm>=1.30",
64+
"openai>=1.12", # NVIDIA NIM support
6365
]
6466

6567
[project.scripts]

tests/unit/test_factory.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,25 @@
22

33
import pytest
44

5-
from vektori.models.factory import create_embedder, create_llm
5+
from vektori.models.anthropic import AnthropicLLM
6+
from vektori.models.factory import LLM_REGISTRY, create_embedder, create_llm
7+
from vektori.models.nvidia import DEFAULT_EMBEDDING_MODEL, NvidiaEmbedder, NvidiaLLM
8+
from vektori.models.ollama import OllamaEmbedder, OllamaLLM
9+
from vektori.models.openai import OpenAIEmbedder, OpenAILLM
610

711

812
def test_create_openai_embedder():
9-
from vektori.models.openai import OpenAIEmbedder
10-
1113
embedder = create_embedder("openai:text-embedding-3-small")
1214
assert isinstance(embedder, OpenAIEmbedder)
1315
assert embedder.model == "text-embedding-3-small"
1416

1517

1618
def test_create_openai_embedder_default_model():
17-
from vektori.models.openai import OpenAIEmbedder
18-
1919
embedder = create_embedder("openai")
2020
assert isinstance(embedder, OpenAIEmbedder)
2121

2222

2323
def test_create_ollama_embedder():
24-
from vektori.models.ollama import OllamaEmbedder
25-
2624
embedder = create_embedder("ollama:nomic-embed-text")
2725
assert isinstance(embedder, OllamaEmbedder)
2826
assert embedder.model == "nomic-embed-text"
@@ -41,27 +39,51 @@ def test_unknown_embedding_provider_raises():
4139

4240

4341
def test_create_openai_llm():
44-
from vektori.models.openai import OpenAILLM
45-
4642
llm = create_llm("openai:gpt-4o-mini")
4743
assert isinstance(llm, OpenAILLM)
4844
assert llm.model == "gpt-4o-mini"
4945

5046

5147
def test_create_ollama_llm():
52-
from vektori.models.ollama import OllamaLLM
53-
5448
llm = create_llm("ollama:llama3")
5549
assert isinstance(llm, OllamaLLM)
5650

5751

5852
def test_create_anthropic_llm():
59-
from vektori.models.anthropic import AnthropicLLM
60-
6153
llm = create_llm("anthropic:claude-haiku-4-5-20251001")
6254
assert isinstance(llm, AnthropicLLM)
6355

6456

6557
def test_unknown_llm_provider_raises():
6658
with pytest.raises(ValueError, match="Unknown LLM provider"):
6759
create_llm("nonexistent:model")
60+
61+
62+
def test_create_nvidia_embedder_default_model():
63+
embedder = create_embedder("nvidia")
64+
assert isinstance(embedder, NvidiaEmbedder)
65+
assert embedder.model == DEFAULT_EMBEDDING_MODEL
66+
67+
def test_create_nvidia_embedder_custom_dimensions():
68+
embedder = create_embedder("nvidia:llama-nemotron-embed-1b-v2", dimensions=1024)
69+
assert isinstance(embedder, NvidiaEmbedder)
70+
assert embedder.dimension == 1024 # Matryoshka support
71+
72+
def test_create_nvidia_llm():
73+
llm = create_llm("nvidia:llama-3.3-nemotron-super-49b-v1")
74+
assert isinstance(llm, NvidiaLLM)
75+
assert llm.model == "nvidia/llama-3.3-nemotron-super-49b-v1"
76+
77+
def test_create_nvidia_llm_default_model():
78+
llm = create_llm("nvidia")
79+
assert isinstance(llm, NvidiaLLM)
80+
assert "nvidia/llama-3.3-nemotron-super-49b-v1" == llm.model
81+
82+
def test_nvidia_llm_registered():
83+
"""Verify NVIDIA LLM is registered in factory."""
84+
assert "nvidia" in LLM_REGISTRY, "nvidia should be registered in LLM_REGISTRY"
85+
llm = create_llm("nvidia")
86+
assert llm is not None, "create_llm('nvidia') should return a valid instance"
87+
assert "Nvidia" in llm.__class__.__name__, (
88+
f"LLM class name should include 'Nvidia', got {llm.__class__.__name__}"
89+
)

vektori/models/factory.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"cloudflare": "vektori.models.cloudflare.CloudflareEmbedder",
2121
# LiteLLM: 100+ providers — Together AI, Cohere, Azure, Ollama, etc.
2222
"litellm": "vektori.models.litellm_embedder.LiteLLMEmbedder",
23+
"nvidia": "vektori.models.nvidia.NvidiaEmbedder",
2324
}
2425

2526
LLM_REGISTRY: dict[str, str] = {
@@ -31,6 +32,7 @@
3132
"gemini": "vektori.models.gemini.GeminiLLM", # Direct Gemini API
3233
# LiteLLM: single interface for 100+ providers — recommended for extraction
3334
"litellm": "vektori.models.litellm_provider.LiteLLMProvider",
35+
"nvidia": "vektori.models.nvidia.NvidiaLLM",
3436
}
3537

3638

0 commit comments

Comments
 (0)