mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-05-01 23:32:39 +00:00
added from suggestions
This commit is contained in:
@@ -11,6 +11,7 @@ from crewai.agents.crew_agent_executor import CrewAgentExecutor
|
|||||||
from crewai.cli.constants import ENV_VARS
|
from crewai.cli.constants import ENV_VARS
|
||||||
from crewai.llm import LLM
|
from crewai.llm import LLM
|
||||||
from crewai.knowledge.knowledge import Knowledge
|
from crewai.knowledge.knowledge import Knowledge
|
||||||
|
from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource
|
||||||
from crewai.memory.contextual.contextual_memory import ContextualMemory
|
from crewai.memory.contextual.contextual_memory import ContextualMemory
|
||||||
from crewai.tools import BaseTool
|
from crewai.tools import BaseTool
|
||||||
from crewai.tools.agent_tools.agent_tools import AgentTools
|
from crewai.tools.agent_tools.agent_tools import AgentTools
|
||||||
@@ -121,10 +122,14 @@ class Agent(BaseAgent):
|
|||||||
default="safe",
|
default="safe",
|
||||||
description="Mode for code execution: 'safe' (using Docker) or 'unsafe' (direct execution).",
|
description="Mode for code execution: 'safe' (using Docker) or 'unsafe' (direct execution).",
|
||||||
)
|
)
|
||||||
knowledge: Optional[Dict[str, Any]] = Field(
|
knowledge: Optional[Union[List[BaseKnowledgeSource], Knowledge]] = Field(
|
||||||
default=None,
|
default=None,
|
||||||
description="Knowledge for the agent. Add knowledge sources to the knowledge object.",
|
description="Knowledge for the agent. Add knowledge sources to the knowledge object.",
|
||||||
)
|
)
|
||||||
|
embedder_config: Optional[Dict[str, Any]] = Field(
|
||||||
|
default=None,
|
||||||
|
description="Embedder configuration for the agent.",
|
||||||
|
)
|
||||||
|
|
||||||
@model_validator(mode="after")
|
@model_validator(mode="after")
|
||||||
def post_init_setup(self):
|
def post_init_setup(self):
|
||||||
@@ -245,21 +250,15 @@ class Agent(BaseAgent):
|
|||||||
try:
|
try:
|
||||||
if self.knowledge:
|
if self.knowledge:
|
||||||
knowledge_agent_name = f"{self.role.replace(' ', '_')}"
|
knowledge_agent_name = f"{self.role.replace(' ', '_')}"
|
||||||
if isinstance(self.knowledge, dict):
|
print("knowledge_agent_name", knowledge_agent_name)
|
||||||
knowledge_data = self.knowledge.copy()
|
if isinstance(self.knowledge, list) and all(
|
||||||
knowledge_data["store_dir"] = knowledge_agent_name
|
isinstance(k, BaseKnowledgeSource) for k in self.knowledge
|
||||||
self.knowledge = Knowledge(**knowledge_data)
|
):
|
||||||
self.knowledge.storage.initialize_knowledge_storage()
|
self.knowledge = Knowledge(
|
||||||
try:
|
sources=self.knowledge,
|
||||||
for source in self.knowledge.sources:
|
embedder_config=self.embedder_config,
|
||||||
source.storage = self.knowledge.storage
|
collection_name=knowledge_agent_name,
|
||||||
source.add()
|
)
|
||||||
except Exception as e:
|
|
||||||
self._logger.log(
|
|
||||||
"warning",
|
|
||||||
f"Failed to init knowledge: {knowledge_agent_name} {e}",
|
|
||||||
color="yellow",
|
|
||||||
)
|
|
||||||
except (TypeError, ValueError) as e:
|
except (TypeError, ValueError) as e:
|
||||||
raise ValueError(f"Invalid Knowledge Configuration: {str(e)}")
|
raise ValueError(f"Invalid Knowledge Configuration: {str(e)}")
|
||||||
|
|
||||||
@@ -303,7 +302,7 @@ class Agent(BaseAgent):
|
|||||||
|
|
||||||
if self.knowledge and isinstance(self.knowledge, Knowledge):
|
if self.knowledge and isinstance(self.knowledge, Knowledge):
|
||||||
agent_knowledge_snippets = self.knowledge.query([task.prompt()])
|
agent_knowledge_snippets = self.knowledge.query([task.prompt()])
|
||||||
agent_knowledge_context = self._extract_knowledge_context(
|
agent_knowledge_context = self.knowledge.extract_knowledge_context(
|
||||||
agent_knowledge_snippets
|
agent_knowledge_snippets
|
||||||
)
|
)
|
||||||
if agent_knowledge_context:
|
if agent_knowledge_context:
|
||||||
@@ -312,7 +311,9 @@ class Agent(BaseAgent):
|
|||||||
if self.crew and self.crew.knowledge:
|
if self.crew and self.crew.knowledge:
|
||||||
knowledge_snippets = self.crew.knowledge.query([task.prompt()])
|
knowledge_snippets = self.crew.knowledge.query([task.prompt()])
|
||||||
|
|
||||||
crew_knowledge_context = self._extract_knowledge_context(knowledge_snippets)
|
crew_knowledge_context = self.crew.knowledge.extract_knowledge_context(
|
||||||
|
knowledge_snippets
|
||||||
|
)
|
||||||
if crew_knowledge_context:
|
if crew_knowledge_context:
|
||||||
task_prompt += crew_knowledge_context
|
task_prompt += crew_knowledge_context
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ from crewai.memory.entity.entity_memory import EntityMemory
|
|||||||
from crewai.memory.long_term.long_term_memory import LongTermMemory
|
from crewai.memory.long_term.long_term_memory import LongTermMemory
|
||||||
from crewai.memory.short_term.short_term_memory import ShortTermMemory
|
from crewai.memory.short_term.short_term_memory import ShortTermMemory
|
||||||
from crewai.knowledge.knowledge import Knowledge
|
from crewai.knowledge.knowledge import Knowledge
|
||||||
|
from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource
|
||||||
from crewai.memory.user.user_memory import UserMemory
|
from crewai.memory.user.user_memory import UserMemory
|
||||||
from crewai.process import Process
|
from crewai.process import Process
|
||||||
from crewai.task import Task
|
from crewai.task import Task
|
||||||
@@ -202,7 +203,7 @@ class Crew(BaseModel):
|
|||||||
default=[],
|
default=[],
|
||||||
description="List of execution logs for tasks",
|
description="List of execution logs for tasks",
|
||||||
)
|
)
|
||||||
knowledge: Optional[Dict[str, Any]] = Field(
|
knowledge: Optional[Union[List[BaseKnowledgeSource], Knowledge]] = Field(
|
||||||
default=None,
|
default=None,
|
||||||
description="Knowledge for the crew. Add knowledge sources to the knowledge object.",
|
description="Knowledge for the crew. Add knowledge sources to the knowledge object.",
|
||||||
)
|
)
|
||||||
@@ -285,16 +286,15 @@ class Crew(BaseModel):
|
|||||||
"""Create the knowledge for the crew."""
|
"""Create the knowledge for the crew."""
|
||||||
if self.knowledge:
|
if self.knowledge:
|
||||||
try:
|
try:
|
||||||
self.knowledge = (
|
if isinstance(self.knowledge, list) and all(
|
||||||
Knowledge(**self.knowledge, store_dir="crew")
|
isinstance(k, BaseKnowledgeSource) for k in self.knowledge
|
||||||
if isinstance(self.knowledge, dict)
|
):
|
||||||
else self.knowledge
|
self.knowledge = Knowledge(
|
||||||
)
|
sources=self.knowledge,
|
||||||
self.knowledge.storage.initialize_knowledge_storage()
|
embedder_config=self.embedder,
|
||||||
|
collection_name="crew",
|
||||||
|
)
|
||||||
|
|
||||||
for source in self.knowledge.sources:
|
|
||||||
source.storage = self.knowledge.storage
|
|
||||||
source.add()
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.log(
|
self._logger.log(
|
||||||
"warning", f"Failed to init knowledge: {e}", color="yellow"
|
"warning", f"Failed to init knowledge: {e}", color="yellow"
|
||||||
|
|||||||
@@ -23,11 +23,12 @@ class Knowledge(BaseModel):
|
|||||||
model_config = ConfigDict(arbitrary_types_allowed=True)
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
||||||
storage: KnowledgeStorage = Field(default_factory=KnowledgeStorage)
|
storage: KnowledgeStorage = Field(default_factory=KnowledgeStorage)
|
||||||
embedder_config: Optional[Dict[str, Any]] = None
|
embedder_config: Optional[Dict[str, Any]] = None
|
||||||
store_dir: Optional[str] = None
|
collection_name: Optional[str] = None
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
store_dir: str,
|
collection_name: str,
|
||||||
|
sources: List[BaseKnowledgeSource],
|
||||||
embedder_config: Optional[Dict[str, Any]] = None,
|
embedder_config: Optional[Dict[str, Any]] = None,
|
||||||
storage: Optional[KnowledgeStorage] = None,
|
storage: Optional[KnowledgeStorage] = None,
|
||||||
**data,
|
**data,
|
||||||
@@ -37,8 +38,13 @@ class Knowledge(BaseModel):
|
|||||||
self.storage = storage
|
self.storage = storage
|
||||||
else:
|
else:
|
||||||
self.storage = KnowledgeStorage(
|
self.storage = KnowledgeStorage(
|
||||||
embedder_config=embedder_config, store_dir=store_dir
|
embedder_config=embedder_config, collection_name=collection_name
|
||||||
)
|
)
|
||||||
|
self.sources = sources
|
||||||
|
self.storage.initialize_knowledge_storage()
|
||||||
|
for source in sources:
|
||||||
|
source.storage = self.storage
|
||||||
|
source.add()
|
||||||
|
|
||||||
def query(
|
def query(
|
||||||
self, query: List[str], limit: int = 3, preference: Optional[str] = None
|
self, query: List[str], limit: int = 3, preference: Optional[str] = None
|
||||||
@@ -55,3 +61,20 @@ class Knowledge(BaseModel):
|
|||||||
score_threshold=DEFAULT_SCORE_THRESHOLD,
|
score_threshold=DEFAULT_SCORE_THRESHOLD,
|
||||||
)
|
)
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
def extract_knowledge_context(
|
||||||
|
self, knowledge_snippets: List[Dict[str, Any]]
|
||||||
|
) -> str:
|
||||||
|
"""Extract knowledge from the task prompt."""
|
||||||
|
valid_snippets = [
|
||||||
|
result["context"]
|
||||||
|
for result in knowledge_snippets
|
||||||
|
if result and result.get("context")
|
||||||
|
]
|
||||||
|
snippet = "\n".join(valid_snippets)
|
||||||
|
return f"Additional Information: {snippet}" if valid_snippets else ""
|
||||||
|
|
||||||
|
def _add_sources(self):
|
||||||
|
for source in self.sources:
|
||||||
|
source.storage = self.storage
|
||||||
|
source.add()
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class BaseKnowledgeSource(BaseModel, ABC):
|
|||||||
model_config = ConfigDict(arbitrary_types_allowed=True)
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
||||||
storage: KnowledgeStorage = Field(default_factory=KnowledgeStorage)
|
storage: KnowledgeStorage = Field(default_factory=KnowledgeStorage)
|
||||||
metadata: Dict[str, Any] = Field(default_factory=dict)
|
metadata: Dict[str, Any] = Field(default_factory=dict)
|
||||||
store_dir: Optional[str] = Field(default=None)
|
collection_name: Optional[str] = Field(default=None)
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def load_content(self) -> Dict[Any, str]:
|
def load_content(self) -> Dict[Any, str]:
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class StringKnowledgeSource(BaseKnowledgeSource):
|
|||||||
"""A knowledge source that stores and queries plain text content using embeddings."""
|
"""A knowledge source that stores and queries plain text content using embeddings."""
|
||||||
|
|
||||||
content: str = Field(...)
|
content: str = Field(...)
|
||||||
store_dir: Optional[str] = Field(default=None)
|
collection_name: Optional[str] = Field(default=None)
|
||||||
|
|
||||||
def model_post_init(self, _):
|
def model_post_init(self, _):
|
||||||
"""Post-initialization method to validate content."""
|
"""Post-initialization method to validate content."""
|
||||||
|
|||||||
@@ -35,16 +35,16 @@ class KnowledgeStorage(BaseKnowledgeStorage):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
collection: Optional[chromadb.Collection] = None
|
collection: Optional[chromadb.Collection] = None
|
||||||
store_dir: Optional[str] = "knowledge"
|
collection_name: Optional[str] = "knowledge"
|
||||||
app: Optional[chromadb.PersistentClient] = None
|
app: Optional[chromadb.PersistentClient] = None
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
embedder_config: Optional[Dict[str, Any]] = None,
|
embedder_config: Optional[Dict[str, Any]] = None,
|
||||||
store_dir: Optional[str] = None,
|
collection_name: Optional[str] = None,
|
||||||
):
|
):
|
||||||
self.embedder_config = embedder_config
|
self.embedder_config = embedder_config
|
||||||
self.store_dir = store_dir
|
self.collection_name = collection_name
|
||||||
|
|
||||||
def search(
|
def search(
|
||||||
self,
|
self,
|
||||||
@@ -85,9 +85,16 @@ class KnowledgeStorage(BaseKnowledgeStorage):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
collection_name = (
|
collection_name = (
|
||||||
f"knowledge_{self.store_dir}" if self.store_dir else "knowledge"
|
f"knowledge_{self.collection_name}"
|
||||||
|
if self.collection_name
|
||||||
|
else "knowledge"
|
||||||
)
|
)
|
||||||
self.collection = self.app.get_or_create_collection(name=collection_name)
|
if self.app:
|
||||||
|
self.collection = self.app.get_or_create_collection(
|
||||||
|
name=collection_name
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise Exception("Vector Database Client not initialized")
|
||||||
except Exception:
|
except Exception:
|
||||||
raise Exception("Failed to create or get collection")
|
raise Exception("Failed to create or get collection")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user