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
16 changes: 13 additions & 3 deletions docs/edge/ar/concepts/knowledge.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@ mode: "wide"

### إعداد عميل المتجه (RAG)

يوفر CrewAI تجريدًا لعميل RAG محايد بالنسبة للمزود لمتاجر المتجهات. المزود الافتراضي هو ChromaDB، ويتم دعم Qdrant أيضًا. يمكنك التبديل بين المزودين باستخدام أدوات الإعداد.
يوفر CrewAI تجريدًا لعميل RAG محايد بالنسبة للمزود لمتاجر المتجهات. المزود الافتراضي هو ChromaDB، ويتم دعم Qdrant وMilvus أيضًا. يمكنك التبديل بين المزودين باستخدام أدوات الإعداد.

المدعوم حاليًا:
- ChromaDB (افتراضي)
- Qdrant
- Milvus

```python Code
from crewai.rag.config.utils import set_rag_config, get_rag_client, clear_rag_config
Expand All @@ -46,12 +47,21 @@ from crewai.rag.qdrant.config import QdrantConfig
set_rag_config(QdrantConfig())
qdrant_client = get_rag_client()

# Milvus (defaults to Milvus Lite at ./milvus.db)
from crewai.rag.milvus.config import MilvusConfig
set_rag_config(MilvusConfig())
milvus_client = get_rag_client()

# Milvus server or Zilliz Cloud
# set_rag_config(MilvusConfig(options={"uri": "http://localhost:19530"}))
# set_rag_config(MilvusConfig(options={"uri": "https://your-endpoint", "token": "your-token"}))

# Example operations (same API for any provider)
client = qdrant_client # or chromadb_client
client = milvus_client # or chromadb_client / qdrant_client
client.create_collection(collection_name="docs")
client.add_documents(
collection_name="docs",
documents=[{"id": "1", "content": "CrewAI enables collaborative AI agents."}],
documents=[{"doc_id": "1", "content": "CrewAI enables collaborative AI agents."}],
)
results = client.search(collection_name="docs", query="collaborative agents", limit=3)

Expand Down
18 changes: 13 additions & 5 deletions docs/edge/en/concepts/knowledge.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@ Also, use relative paths from the `knowledge` directory when creating the source

### Vector store (RAG) client configuration

CrewAI exposes a provider-neutral RAG client abstraction for vector stores. The default provider is ChromaDB, and Qdrant is supported as well. You can switch providers using configuration utilities.
CrewAI exposes a provider-neutral RAG client abstraction for vector stores. The default provider is ChromaDB, and Qdrant and Milvus are supported as well. You can switch providers using configuration utilities.

Supported today:
- ChromaDB (default)
- Qdrant
- Milvus

```python Code
from crewai.rag.config.utils import set_rag_config, get_rag_client, clear_rag_config
Expand All @@ -46,12 +47,21 @@ from crewai.rag.qdrant.config import QdrantConfig
set_rag_config(QdrantConfig())
qdrant_client = get_rag_client()

# Milvus (defaults to Milvus Lite at ./milvus.db)
from crewai.rag.milvus.config import MilvusConfig
set_rag_config(MilvusConfig())
milvus_client = get_rag_client()

# Milvus server or Zilliz Cloud
# set_rag_config(MilvusConfig(options={"uri": "http://localhost:19530"}))
# set_rag_config(MilvusConfig(options={"uri": "https://your-endpoint", "token": "your-token"}))

# Example operations (same API for any provider)
client = qdrant_client # or chromadb_client
client = milvus_client # or chromadb_client / qdrant_client
client.create_collection(collection_name="docs")
client.add_documents(
collection_name="docs",
documents=[{"id": "1", "content": "CrewAI enables collaborative AI agents."}],
documents=[{"doc_id": "1", "content": "CrewAI enables collaborative AI agents."}],
)
results = client.search(collection_name="docs", query="collaborative agents", limit=3)

Expand Down Expand Up @@ -1093,5 +1103,3 @@ This is useful when you've updated your knowledge sources and want to ensure tha
- Use environment variables for API keys and sensitive configuration
</Accordion>
</AccordionGroup>


3 changes: 3 additions & 0 deletions lib/crewai/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ docling = [
qdrant = [
"qdrant-client[fastembed]~=1.14.3",
]
milvus = [
"pymilvus[milvus-lite]>=3.0.0,<4",
]
aws = [
"boto3~=1.42.90",
"aiobotocore~=3.5.0",
Expand Down
2 changes: 1 addition & 1 deletion lib/crewai/src/crewai/rag/config/optional_imports/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class _MissingProvider:
Raises RuntimeError when instantiated to indicate missing dependencies.
"""

provider: Literal["chromadb", "qdrant", "__missing__"] = field(
provider: Literal["chromadb", "milvus", "qdrant", "__missing__"] = field(
default="__missing__"
)

Expand Down
10 changes: 10 additions & 0 deletions lib/crewai/src/crewai/rag/config/optional_imports/protocols.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
if TYPE_CHECKING:
from crewai.rag.chromadb.client import ChromaDBClient
from crewai.rag.chromadb.config import ChromaDBConfig
from crewai.rag.milvus.client import MilvusClient
from crewai.rag.milvus.config import MilvusConfig
from crewai.rag.qdrant.client import QdrantClient
from crewai.rag.qdrant.config import QdrantConfig

Expand All @@ -26,3 +28,11 @@ class QdrantFactoryModule(Protocol):
def create_client(self, config: QdrantConfig) -> QdrantClient:
"""Creates a Qdrant client from configuration."""
...


class MilvusFactoryModule(Protocol):
"""Protocol for Milvus factory module."""

def create_client(self, config: MilvusConfig) -> MilvusClient:
"""Creates a Milvus client from configuration."""
...
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ class MissingChromaDBConfig(_MissingProvider):
provider: Literal["chromadb"] = field(default="chromadb")


@pyd_dataclass(config=ConfigDict(extra="forbid"))
class MissingMilvusConfig(_MissingProvider):
"""Placeholder for missing Milvus configuration."""

provider: Literal["milvus"] = field(default="milvus")


@pyd_dataclass(config=ConfigDict(extra="forbid"))
class MissingQdrantConfig(_MissingProvider):
"""Placeholder for missing Qdrant configuration."""
Expand Down
2 changes: 1 addition & 1 deletion lib/crewai/src/crewai/rag/config/optional_imports/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@


SupportedProvider = Annotated[
Literal["chromadb", "qdrant"],
Literal["chromadb", "milvus", "qdrant"],
"Supported RAG provider types, add providers here as they become available",
]
11 changes: 10 additions & 1 deletion lib/crewai/src/crewai/rag/config/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
# Linter freaks out on conditional imports, assigning in the type checking fixes it
if TYPE_CHECKING:
from crewai.rag.chromadb.config import ChromaDBConfig as ChromaDBConfig_
from crewai.rag.milvus.config import MilvusConfig as MilvusConfig_

ChromaDBConfig = ChromaDBConfig_
MilvusConfig = MilvusConfig_
from crewai.rag.qdrant.config import QdrantConfig as QdrantConfig_

QdrantConfig = QdrantConfig_
Expand All @@ -23,14 +25,21 @@
MissingChromaDBConfig as ChromaDBConfig,
)

try:
from crewai.rag.milvus.config import MilvusConfig
except ImportError:
from crewai.rag.config.optional_imports.providers import (
MissingMilvusConfig as MilvusConfig,
)

try:
from crewai.rag.qdrant.config import QdrantConfig
except ImportError:
from crewai.rag.config.optional_imports.providers import (
MissingQdrantConfig as QdrantConfig,
)

SupportedProviderConfig: TypeAlias = ChromaDBConfig | QdrantConfig
SupportedProviderConfig: TypeAlias = ChromaDBConfig | MilvusConfig | QdrantConfig
RagConfigType: TypeAlias = Annotated[
SupportedProviderConfig, Field(discriminator=DISCRIMINATOR)
]
11 changes: 11 additions & 0 deletions lib/crewai/src/crewai/rag/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from crewai.rag.config.optional_imports.protocols import (
ChromaFactoryModule,
MilvusFactoryModule,
QdrantFactoryModule,
)
from crewai.rag.config.types import RagConfigType
Expand Down Expand Up @@ -75,4 +76,14 @@ def create_client(config: RagConfigType) -> BaseClient:
)
return qdrant_mod.create_client(config)

if config.provider == "milvus":
milvus_mod = cast(
MilvusFactoryModule,
require(
"crewai.rag.milvus.factory",
purpose="The 'milvus' provider",
),
)
return milvus_mod.create_client(config)

raise ValueError(f"Unsupported provider: {config.provider}")
1 change: 1 addition & 0 deletions lib/crewai/src/crewai/rag/milvus/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Milvus RAG provider."""
Loading