Compare commits

..

1 Commits

Author SHA1 Message Date
Brandon Hancock
4854e029ae include fixes for max 2025-02-14 12:22:33 -05:00
5 changed files with 4 additions and 59 deletions

View File

@@ -14,7 +14,6 @@ icon: bars-staggered
- **Sequential**: Executes tasks sequentially, ensuring tasks are completed in an orderly progression.
- **Hierarchical**: Organizes tasks in a managerial hierarchy, where tasks are delegated and executed based on a structured chain of command. A manager language model (`manager_llm`) or a custom manager agent (`manager_agent`) must be specified in the crew to enable the hierarchical process, facilitating the creation and management of tasks by the manager.
- **Parallel**: Enables concurrent execution of multiple flows, allowing transitions from one flow to multiple parallel flows for improved task parallelization. Parallel execution is automatically handled using asyncio for optimal performance.
- **Consensual Process (Planned)**: Aiming for collaborative decision-making among agents on task execution, this process type introduces a democratic approach to task management within CrewAI. It is planned for future development and is not currently implemented in the codebase.
## The Role of Processes in Teamwork
@@ -58,30 +57,9 @@ Emulates a corporate hierarchy, CrewAI allows specifying a custom manager agent
## Process Class: Detailed Overview
The `Process` class is implemented as an enumeration (`Enum`), ensuring type safety and restricting process values to the defined types (`sequential`, `hierarchical`, `parallel`). The consensual process is planned for future inclusion, emphasizing our commitment to continuous development and innovation.
## Parallel Process
The parallel process type enables concurrent execution of multiple flows, leveraging Python's asyncio for efficient task parallelization. When using parallel execution:
- Multiple start methods are executed concurrently
- Listeners can run in parallel when triggered by the same method
- State consistency is maintained through thread-safe operations
- Execution timing and order are preserved where necessary
Example of parallel flow execution:
```python
from crewai import Crew, Process
# Create a crew with parallel process
crew = Crew(
agents=my_agents,
tasks=my_tasks,
process=Process.parallel
)
```
The `Process` class is implemented as an enumeration (`Enum`), ensuring type safety and restricting process values to the defined types (`sequential`, `hierarchical`). The consensual process is planned for future inclusion, emphasizing our commitment to continuous development and innovation.
## Conclusion
The structured collaboration facilitated by processes within CrewAI is crucial for enabling systematic teamwork among agents.
This documentation has been updated to reflect the latest features, enhancements, and the planned integration of the Consensual Process, ensuring users have access to the most current and comprehensive information.
This documentation has been updated to reflect the latest features, enhancements, and the planned integration of the Consensual Process, ensuring users have access to the most current and comprehensive information.

View File

@@ -8,5 +8,4 @@ class Process(str, Enum):
sequential = "sequential"
hierarchical = "hierarchical"
parallel = "parallel"
# TODO: consensual = 'consensual'

View File

@@ -6,7 +6,7 @@
},
"slices": {
"observation": "\nObservation:",
"task": "\nCurrent Task: {input}\n\nBegin! This is VERY important to you, use the tools available and give your best Final Answer, your job depends on it!\n\nThought:",
"task": "\nCurrent Task: {input}\n\nBegin! This is VERY important to you, use the tools available and give your best Final Answer, your job depends on it!\n\n",
"memory": "\n\n# Useful context: \n{memory}",
"role_playing": "You are {role}. {backstory}\nYour personal goal is: {goal}",
"tools": "\nYou ONLY have access to the following tools, and should NEVER make up tools that are not listed here:\n\n{tools}\n\nIMPORTANT: Use the following format in your response:\n\n```\nThought: you should always think about what to do\nAction: the action to take, only one name of [{tool_names}], just the name, exactly as it's written.\nAction Input: the input to the action, just a simple JSON object, enclosed in curly braces, using \" to wrap keys and values.\nObservation: the result of the action\n```\n\nOnce all necessary information is gathered, return the following format:\n\n```\nThought: I now know the final answer\nFinal Answer: the final answer to the original input question\n```",

View File

@@ -110,6 +110,7 @@ def _llm_via_environment_or_fallback() -> Optional[LLM]:
)
api_base = os.environ.get("API_BASE") or os.environ.get("AZURE_API_BASE")
api_version = os.environ.get("API_VERSION") or os.environ.get("AZURE_API_VERSION")
# Synchronize base_url and api_base if one is populated and the other is not
if base_url and not api_base:

View File

@@ -1,7 +1,6 @@
"""Test Flow creation and execution basic functionality."""
import asyncio
import time
from datetime import datetime
import pytest
@@ -621,35 +620,3 @@ def test_stateless_flow_event_emission():
== "Deeds will not be less valiant because they are unpraised."
)
assert isinstance(event_log[5].timestamp, datetime)
def test_parallel_flow():
"""Test a flow where multiple listeners execute in parallel."""
execution_order = []
execution_times = {}
class ParallelFlow(Flow):
@start()
def start_method(self):
execution_order.append("start")
return "start"
@listen(start_method)
async def parallel_1(self):
await asyncio.sleep(0.1)
execution_times["parallel_1"] = time.time()
execution_order.append("parallel_1")
@listen(start_method)
async def parallel_2(self):
await asyncio.sleep(0.1)
execution_times["parallel_2"] = time.time()
execution_order.append("parallel_2")
flow = ParallelFlow()
flow.kickoff()
assert "start" in execution_order
assert "parallel_1" in execution_order
assert "parallel_2" in execution_order
assert abs(execution_times["parallel_1"] - execution_times["parallel_2"]) < 0.05