mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-29 18:18:13 +00:00
Squashed 'packages/tools/' content from commit 78317b9c
git-subtree-dir: packages/tools git-subtree-split: 78317b9c127f18bd040c1d77e3c0840cdc9a5b38
This commit is contained in:
61
crewai_tools/tools/rag/README.md
Normal file
61
crewai_tools/tools/rag/README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# RagTool: A Dynamic Knowledge Base Tool
|
||||
|
||||
RagTool is designed to answer questions by leveraging the power of RAG by leveraging (EmbedChain). It integrates seamlessly with the CrewAI ecosystem, offering a versatile and powerful solution for information retrieval.
|
||||
|
||||
## **Overview**
|
||||
|
||||
RagTool enables users to dynamically query a knowledge base, making it an ideal tool for applications requiring access to a vast array of information. Its flexible design allows for integration with various data sources, including files, directories, web pages, yoututbe videos and custom configurations.
|
||||
|
||||
## **Usage**
|
||||
|
||||
RagTool can be instantiated with data from different sources, including:
|
||||
|
||||
- 📰 PDF file
|
||||
- 📊 CSV file
|
||||
- 📃 JSON file
|
||||
- 📝 Text
|
||||
- 📁 Directory/ Folder
|
||||
- 🌐 HTML Web page
|
||||
- 📽️ Youtube Channel
|
||||
- 📺 Youtube Video
|
||||
- 📚 Docs website
|
||||
- 📝 MDX file
|
||||
- 📄 DOCX file
|
||||
- 🧾 XML file
|
||||
- 📬 Gmail
|
||||
- 📝 Github
|
||||
- 🐘 Postgres
|
||||
- 🐬 MySQL
|
||||
- 🤖 Slack
|
||||
- 💬 Discord
|
||||
- 🗨️ Discourse
|
||||
- 📝 Substack
|
||||
- 🐝 Beehiiv
|
||||
- 💾 Dropbox
|
||||
- 🖼️ Image
|
||||
- ⚙️ Custom
|
||||
|
||||
#### **Creating an Instance**
|
||||
|
||||
```python
|
||||
from crewai_tools.tools.rag_tool import RagTool
|
||||
|
||||
# Example: Loading from a file
|
||||
rag_tool = RagTool().from_file('path/to/your/file.txt')
|
||||
|
||||
# Example: Loading from a directory
|
||||
rag_tool = RagTool().from_directory('path/to/your/directory')
|
||||
|
||||
# Example: Loading from a web page
|
||||
rag_tool = RagTool().from_web_page('https://example.com')
|
||||
```
|
||||
|
||||
## **Contribution**
|
||||
|
||||
Contributions to RagTool and the broader CrewAI tools ecosystem are welcome. To contribute, please follow the standard GitHub workflow for forking the repository, making changes, and submitting a pull request.
|
||||
|
||||
## **License**
|
||||
|
||||
RagTool is open-source and available under the MIT license.
|
||||
|
||||
Thank you for considering RagTool for your knowledge base needs. Your contributions and feedback are invaluable to making RagTool even better.
|
||||
0
crewai_tools/tools/rag/__init__.py
Normal file
0
crewai_tools/tools/rag/__init__.py
Normal file
70
crewai_tools/tools/rag/rag_tool.py
Normal file
70
crewai_tools/tools/rag/rag_tool.py
Normal file
@@ -0,0 +1,70 @@
|
||||
import portalocker
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Any
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
|
||||
from crewai.tools import BaseTool
|
||||
|
||||
|
||||
class Adapter(BaseModel, ABC):
|
||||
model_config = ConfigDict(arbitrary_types_allowed=True)
|
||||
|
||||
@abstractmethod
|
||||
def query(self, question: str) -> str:
|
||||
"""Query the knowledge base with a question and return the answer."""
|
||||
|
||||
@abstractmethod
|
||||
def add(
|
||||
self,
|
||||
*args: Any,
|
||||
**kwargs: Any,
|
||||
) -> None:
|
||||
"""Add content to the knowledge base."""
|
||||
|
||||
|
||||
class RagTool(BaseTool):
|
||||
class _AdapterPlaceholder(Adapter):
|
||||
def query(self, question: str) -> str:
|
||||
raise NotImplementedError
|
||||
|
||||
def add(self, *args: Any, **kwargs: Any) -> None:
|
||||
raise NotImplementedError
|
||||
|
||||
name: str = "Knowledge base"
|
||||
description: str = "A knowledge base that can be used to answer questions."
|
||||
summarize: bool = False
|
||||
adapter: Adapter = Field(default_factory=_AdapterPlaceholder)
|
||||
config: dict[str, Any] | None = None
|
||||
|
||||
@model_validator(mode="after")
|
||||
def _set_default_adapter(self):
|
||||
if isinstance(self.adapter, RagTool._AdapterPlaceholder):
|
||||
try:
|
||||
from embedchain import App
|
||||
except ImportError:
|
||||
raise ImportError("embedchain is not installed. Please install it with `pip install crewai-tools[embedchain]`")
|
||||
|
||||
from crewai_tools.adapters.embedchain_adapter import EmbedchainAdapter
|
||||
|
||||
with portalocker.Lock("crewai-rag-tool.lock", timeout=10):
|
||||
app = App.from_config(config=self.config) if self.config else App()
|
||||
|
||||
self.adapter = EmbedchainAdapter(
|
||||
embedchain_app=app, summarize=self.summarize
|
||||
)
|
||||
|
||||
return self
|
||||
|
||||
def add(
|
||||
self,
|
||||
*args: Any,
|
||||
**kwargs: Any,
|
||||
) -> None:
|
||||
self.adapter.add(*args, **kwargs)
|
||||
|
||||
def _run(
|
||||
self,
|
||||
query: str,
|
||||
) -> str:
|
||||
return f"Relevant Content:\n{self.adapter.query(query)}"
|
||||
Reference in New Issue
Block a user