mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-29 18:18:13 +00:00
Compare commits
4 Commits
devin/1735
...
ea413ae03b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea413ae03b | ||
|
|
f1299f484d | ||
|
|
a0c322a535 | ||
|
|
86f58c95de |
@@ -171,6 +171,58 @@ crewai reset-memories --knowledge
|
|||||||
|
|
||||||
This is useful when you've updated your knowledge sources and want to ensure that the agents are using the most recent information.
|
This is useful when you've updated your knowledge sources and want to ensure that the agents are using the most recent information.
|
||||||
|
|
||||||
|
## Agent-Specific Knowledge
|
||||||
|
|
||||||
|
While knowledge can be provided at the crew level using `crew.knowledge_sources`, individual agents can also have their own knowledge sources using the `knowledge_sources` parameter:
|
||||||
|
|
||||||
|
```python Code
|
||||||
|
from crewai import Agent, Task, Crew
|
||||||
|
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource
|
||||||
|
|
||||||
|
# Create agent-specific knowledge about a product
|
||||||
|
product_specs = StringKnowledgeSource(
|
||||||
|
content="""The XPS 13 laptop features:
|
||||||
|
- 13.4-inch 4K display
|
||||||
|
- Intel Core i7 processor
|
||||||
|
- 16GB RAM
|
||||||
|
- 512GB SSD storage
|
||||||
|
- 12-hour battery life""",
|
||||||
|
metadata={"category": "product_specs"}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a support agent with product knowledge
|
||||||
|
support_agent = Agent(
|
||||||
|
role="Technical Support Specialist",
|
||||||
|
goal="Provide accurate product information and support.",
|
||||||
|
backstory="You are an expert on our laptop products and specifications.",
|
||||||
|
knowledge_sources=[product_specs] # Agent-specific knowledge
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a task that requires product knowledge
|
||||||
|
support_task = Task(
|
||||||
|
description="Answer this customer question: {question}",
|
||||||
|
agent=support_agent
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create and run the crew
|
||||||
|
crew = Crew(
|
||||||
|
agents=[support_agent],
|
||||||
|
tasks=[support_task]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Get answer about the laptop's specifications
|
||||||
|
result = crew.kickoff(
|
||||||
|
inputs={"question": "What is the storage capacity of the XPS 13?"}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<Info>
|
||||||
|
Benefits of agent-specific knowledge:
|
||||||
|
- Give agents specialized information for their roles
|
||||||
|
- Maintain separation of concerns between agents
|
||||||
|
- Combine with crew-level knowledge for layered information access
|
||||||
|
</Info>
|
||||||
|
|
||||||
## Custom Knowledge Sources
|
## Custom Knowledge Sources
|
||||||
|
|
||||||
CrewAI allows you to create custom knowledge sources for any type of data by extending the `BaseKnowledgeSource` class. Let's create a practical example that fetches and processes space news articles.
|
CrewAI allows you to create custom knowledge sources for any type of data by extending the `BaseKnowledgeSource` class. Let's create a practical example that fetches and processes space news articles.
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class CrewAgentExecutorMixin:
|
|||||||
|
|
||||||
def _should_force_answer(self) -> bool:
|
def _should_force_answer(self) -> bool:
|
||||||
"""Determine if a forced answer is required based on iteration count."""
|
"""Determine if a forced answer is required based on iteration count."""
|
||||||
return (self.iterations >= self.max_iter) and not self.have_forced_answer
|
return self.iterations >= self.max_iter
|
||||||
|
|
||||||
def _create_short_term_memory(self, output) -> None:
|
def _create_short_term_memory(self, output) -> None:
|
||||||
"""Create and save a short-term memory item if conditions are met."""
|
"""Create and save a short-term memory item if conditions are met."""
|
||||||
|
|||||||
@@ -26,9 +26,10 @@ class BaseFileKnowledgeSource(BaseKnowledgeSource, ABC):
|
|||||||
safe_file_paths: List[Path] = Field(default_factory=list)
|
safe_file_paths: List[Path] = Field(default_factory=list)
|
||||||
|
|
||||||
@field_validator("file_path", "file_paths", mode="before")
|
@field_validator("file_path", "file_paths", mode="before")
|
||||||
def validate_file_path(cls, v, values):
|
def validate_file_path(cls, v, info):
|
||||||
"""Validate that at least one of file_path or file_paths is provided."""
|
"""Validate that at least one of file_path or file_paths is provided."""
|
||||||
if v is None and ("file_path" not in values or values.get("file_path") is None):
|
# Single check if both are None, O(1) instead of nested conditions
|
||||||
|
if v is None and info.data.get("file_path" if info.field_name == "file_paths" else "file_paths") is None:
|
||||||
raise ValueError("Either file_path or file_paths must be provided")
|
raise ValueError("Either file_path or file_paths must be provided")
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|||||||
@@ -584,3 +584,28 @@ def test_docling_source_with_local_file():
|
|||||||
docling_source = CrewDoclingSource(file_paths=[pdf_path])
|
docling_source = CrewDoclingSource(file_paths=[pdf_path])
|
||||||
assert docling_source.file_paths == [pdf_path]
|
assert docling_source.file_paths == [pdf_path]
|
||||||
assert docling_source.content is not None
|
assert docling_source.content is not None
|
||||||
|
|
||||||
|
|
||||||
|
def test_file_path_validation():
|
||||||
|
"""Test file path validation for knowledge sources."""
|
||||||
|
current_dir = Path(__file__).parent
|
||||||
|
pdf_path = current_dir / "crewai_quickstart.pdf"
|
||||||
|
|
||||||
|
# Test valid single file_path
|
||||||
|
source = PDFKnowledgeSource(file_path=pdf_path)
|
||||||
|
assert source.safe_file_paths == [pdf_path]
|
||||||
|
|
||||||
|
# Test valid file_paths list
|
||||||
|
source = PDFKnowledgeSource(file_paths=[pdf_path])
|
||||||
|
assert source.safe_file_paths == [pdf_path]
|
||||||
|
|
||||||
|
# Test both file_path and file_paths provided (should use file_paths)
|
||||||
|
source = PDFKnowledgeSource(file_path=pdf_path, file_paths=[pdf_path])
|
||||||
|
assert source.safe_file_paths == [pdf_path]
|
||||||
|
|
||||||
|
# Test neither file_path nor file_paths provided
|
||||||
|
with pytest.raises(
|
||||||
|
ValueError,
|
||||||
|
match="file_path/file_paths must be a Path, str, or a list of these types"
|
||||||
|
):
|
||||||
|
PDFKnowledgeSource()
|
||||||
|
|||||||
Reference in New Issue
Block a user