Compare commits

...
3 Commits
Author SHA1 Message Date
Mervin Praison 0d5c8b478f Merge pull request #291 from MervinPraison/develop
Add parallelisation feature and update documentation
2025-01-13 07:52:07 +00:00
MervinPraison fdfad70319 Update PraisonAI and praisonaiagents to version 2.0.44 and 0.0.34 respectively
- Bumped the PraisonAI package version from 2.0.43 to 2.0.44 in Dockerfile, pyproject.toml, and related files.
- Updated the installation command in Dockerfile and deployment scripts to reflect the new version.
- Updated the praisonaiagents package version from 0.0.33 to 0.0.34 in relevant files.
- Adjusted dependencies in uv.lock for compatibility with the new versions.
- Refactored agent definitions in parallelization scripts to remove unnecessary verbosity parameters for cleaner code.
2025-01-13 07:51:14 +00:00
MervinPraison fba6b2e2a0 Add parallelisation feature and update documentation
- Introduced a new `parallelisation.py` file to implement parallel processing using AI agents, allowing concurrent execution of tasks for improved performance.
- Created multiple agents and tasks to demonstrate parallel execution and result aggregation.
- Added a new documentation file `parallelisation.mdx` detailing the setup, usage, and benefits of the parallelisation feature.
- Updated `mint.json` to include the new parallelisation feature for better tracking and visibility.
2025-01-13 07:38:24 +00:00
13 changed files with 350 additions and 27 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install flask praisonai==2.0.43 gunicorn markdown
RUN pip install flask praisonai==2.0.44 gunicorn markdown
EXPOSE 8080
CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]
+5 -10
View File
@@ -13,31 +13,27 @@ agent1 = Agent(
name="Processor 1",
role="Time collector",
goal="Get the time and return it",
tools=[process_time],
verbose=0
tools=[process_time]
)
agent2 = Agent(
name="Processor 2",
role="Time collector",
goal="Get the time and return it",
tools=[process_time],
verbose=0
tools=[process_time]
)
agent3 = Agent(
name="Processor 3",
role="Time collector",
goal="Get the time and return it",
tools=[process_time],
verbose=0
tools=[process_time]
)
aggregator = Agent(
name="Aggregator",
role="Result aggregator",
goal="Collect all the processed time from all tasks",
verbose=0
goal="Collect all the processed time from all tasks"
)
# Create parallel tasks with memory disabled
@@ -82,8 +78,7 @@ async def main():
workflow = PraisonAIAgents(
agents=[agent1, agent2, agent3, aggregator],
tasks=[task1, task2, task3, aggregate_task],
process="workflow",
verbose=0
process="workflow"
)
# Run parallel workflow
+2 -1
View File
@@ -16,7 +16,8 @@ from ..main import (
display_self_reflection,
ReflectionOutput,
client,
error_logs
error_logs,
adisplay_instruction
)
import inspect
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "praisonaiagents"
version = "0.0.33"
version = "0.0.34"
description = "Praison AI agents for completing complex tasks with Self Reflection Agents"
authors = [
{ name="Mervin Praison" }
+1 -1
View File
@@ -990,7 +990,7 @@ wheels = [
[[package]]
name = "praisonaiagents"
version = "0.0.33"
version = "0.0.34"
source = { editable = "." }
dependencies = [
{ name = "openai" },
+95
View File
@@ -0,0 +1,95 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
from datetime import datetime
import asyncio
def process_time():
"""Simulate processing"""
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"Processing at: {current_time}")
return f"Processed at {current_time}"
# Create parallel processing agents
agent1 = Agent(
name="Processor 1",
role="Time collector",
goal="Get the time and return it",
tools=[process_time]
)
agent2 = Agent(
name="Processor 2",
role="Time collector",
goal="Get the time and return it",
tools=[process_time]
)
agent3 = Agent(
name="Processor 3",
role="Time collector",
goal="Get the time and return it",
tools=[process_time]
)
aggregator = Agent(
name="Aggregator",
role="Result aggregator",
goal="Collect all the processed time from all tasks"
)
# Create parallel tasks with memory disabled
task1 = Task(
name="process_1",
description="Use process_time tool to get the time",
expected_output="processed time",
agent=agent1,
is_start=True,
async_execution=True
)
task2 = Task(
name="process_2",
description="Use process_time tool to get the time",
expected_output="processed time",
agent=agent2,
is_start=True,
async_execution=True
)
task3 = Task(
name="process_3",
description="Use process_time tool to get the time",
expected_output="processed time",
agent=agent3,
is_start=True,
async_execution=True
)
aggregate_task = Task(
name="aggregate",
description="Collect all the processed time from all tasks",
expected_output="Output all the processed time from all tasks and just the time",
agent=aggregator,
context=[task1, task2, task3]
)
async def main():
# Create workflow manager
workflow = PraisonAIAgents(
agents=[agent1, agent2, agent3, aggregator],
tasks=[task1, task2, task3, aggregate_task],
process="workflow"
)
# Run parallel workflow
results = await workflow.astart()
# Print results
print("\nParallel Processing Results:")
for task_id, result in results["task_results"].items():
if result:
print(f"Task {task_id}: {result.raw}")
# Run the async main function
if __name__ == "__main__":
asyncio.run(main())
+1 -1
View File
@@ -110,7 +110,7 @@ Loads environment variables from .env file or system and sets them.</p>
file.write(&#34;FROM python:3.11-slim\n&#34;)
file.write(&#34;WORKDIR /app\n&#34;)
file.write(&#34;COPY . .\n&#34;)
file.write(&#34;RUN pip install flask praisonai==2.0.43 gunicorn markdown\n&#34;)
file.write(&#34;RUN pip install flask praisonai==2.0.44 gunicorn markdown\n&#34;)
file.write(&#34;EXPOSE 8080\n&#34;)
file.write(&#39;CMD [&#34;gunicorn&#34;, &#34;-b&#34;, &#34;0.0.0.0:8080&#34;, &#34;api:app&#34;]\n&#39;)
+231
View File
@@ -0,0 +1,231 @@
---
title: "Parallelisation"
description: "Learn how to create AI agents that can execute tasks in parallel for improved performance."
icon: "arrows-split-up-and-left"
---
## Quick Start
<Steps>
<Step title="Install Package">
First, install the PraisonAI Agents package:
```bash
pip install praisonaiagents
```
</Step>
<Step title="Set API Key">
Set your OpenAI API key as an environment variable in your terminal:
```bash
export OPENAI_API_KEY=your_api_key_here
```
</Step>
<Step title="Create a file">
Create a new file `app.py` with the basic setup:
```python
from praisonaiagents import Agent, Task, PraisonAIAgents
from datetime import datetime
import asyncio
def process_time():
"""Simulate processing"""
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"Processing at: {current_time}")
return f"Processed at {current_time}"
# Create parallel processing agents
agent1 = Agent(
name="Processor 1",
role="Time collector",
goal="Get the time and return it",
tools=[process_time]
)
agent2 = Agent(
name="Processor 2",
role="Time collector",
goal="Get the time and return it",
tools=[process_time]
)
agent3 = Agent(
name="Processor 3",
role="Time collector",
goal="Get the time and return it",
tools=[process_time]
)
aggregator = Agent(
name="Aggregator",
role="Result aggregator",
goal="Collect all the processed time from all tasks"
)
# Create parallel tasks with memory disabled
task1 = Task(
name="process_1",
description="Use process_time tool to get the time",
expected_output="processed time",
agent=agent1,
is_start=True,
async_execution=True
)
task2 = Task(
name="process_2",
description="Use process_time tool to get the time",
expected_output="processed time",
agent=agent2,
is_start=True,
async_execution=True
)
task3 = Task(
name="process_3",
description="Use process_time tool to get the time",
expected_output="processed time",
agent=agent3,
is_start=True,
async_execution=True
)
aggregate_task = Task(
name="aggregate",
description="Collect all the processed time from all tasks",
expected_output="Output all the processed time from all tasks and just the time",
agent=aggregator,
context=[task1, task2, task3]
)
async def main():
# Create workflow manager
workflow = PraisonAIAgents(
agents=[agent1, agent2, agent3, aggregator],
tasks=[task1, task2, task3, aggregate_task],
process="workflow"
)
# Run parallel workflow
results = await workflow.astart()
# Print results
print("\nParallel Processing Results:")
for task_id, result in results["task_results"].items():
if result:
print(f"Task {task_id}: {result.raw}")
# Run the async main function
if __name__ == "__main__":
asyncio.run(main())
```
</Step>
<Step title="Start Agents">
Type this in your terminal to run your agents:
```bash
python app.py
```
</Step>
</Steps>
<Note>
**Requirements**
- Python 3.10 or higher
- OpenAI API key. Generate OpenAI API key [here](https://platform.openai.com/api-keys). Use Other models using [this guide](/models).
- Basic understanding of Python and async programming
</Note>
## Understanding Parallelisation
<Card title="What is Parallelisation?" icon="question">
Parallelisation enables:
- Concurrent execution of multiple tasks
- Improved performance through parallel processing
- Efficient handling of independent operations
- Aggregation of parallel task results
</Card>
## Features
<CardGroup cols={2}>
<Card title="Parallel Execution" icon="arrows-split-up-and-left">
Run multiple tasks simultaneously for improved performance.
</Card>
<Card title="Async Support" icon="bolt">
Built-in support for asynchronous execution.
</Card>
<Card title="Result Aggregation" icon="layer-group">
Combine results from parallel tasks efficiently.
</Card>
<Card title="Process Control" icon="sliders">
Monitor and manage parallel task execution.
</Card>
</CardGroup>
## Configuration Options
```python
# Create a parallel task
task = Task(
name="parallel_task",
description="Task to run in parallel",
expected_output="Task result",
agent=agent,
is_start=True,
async_execution=True # Enable parallel execution
)
# Create an aggregator task
aggregator_task = Task(
name="aggregate",
description="Aggregate results from parallel tasks",
expected_output="Combined results",
agent=aggregator,
context=[task1, task2, task3] # Reference parallel tasks
)
# Async workflow execution
async def run_workflow():
workflow = PraisonAIAgents(
agents=[agent1, agent2, aggregator],
tasks=[task1, task2, aggregator_task],
process="workflow",
verbose=True
)
results = await workflow.astart()
```
## Troubleshooting
<CardGroup cols={2}>
<Card title="Execution Issues" icon="triangle-exclamation">
If parallel execution fails:
- Check async configuration
- Verify task independence
- Monitor resource usage
</Card>
<Card title="Result Aggregation" icon="diagram-project">
If aggregation is incorrect:
- Review task outputs
- Check context connections
- Verify aggregator logic
</Card>
</CardGroup>
## Next Steps
<CardGroup cols={2}>
<Card title="AutoAgents" icon="robot" href="./autoagents">
Learn about automatically created and managed AI agents
</Card>
<Card title="Mini Agents" icon="microchip" href="./mini">
Explore lightweight, focused AI agents
</Card>
</CardGroup>
<Note>
For optimal results, ensure your parallel tasks are truly independent and your system has sufficient resources to handle concurrent execution.
</Note>
+2 -1
View File
@@ -92,7 +92,8 @@
"features/structured",
"features/callbacks",
"features/agenticrouting",
"features/promptchaining"
"features/promptchaining",
"features/parallelisation"
]
},
{
+1 -1
View File
@@ -3,7 +3,7 @@ class Praisonai < Formula
desc "AI tools for various AI applications"
homepage "https://github.com/MervinPraison/PraisonAI"
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/2.0.43.tar.gz"
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/2.0.44.tar.gz"
sha256 "1828fb9227d10f991522c3f24f061943a254b667196b40b1a3e4a54a8d30ce32" # Replace with actual SHA256 checksum
license "MIT"
+1 -1
View File
@@ -56,7 +56,7 @@ class CloudDeployer:
file.write("FROM python:3.11-slim\n")
file.write("WORKDIR /app\n")
file.write("COPY . .\n")
file.write("RUN pip install flask praisonai==2.0.43 gunicorn markdown\n")
file.write("RUN pip install flask praisonai==2.0.44 gunicorn markdown\n")
file.write("EXPOSE 8080\n")
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
+4 -4
View File
@@ -1,6 +1,6 @@
[project]
name = "PraisonAI"
version = "2.0.43"
version = "2.0.44"
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human–agent collaboration."
readme = "README.md"
license = ""
@@ -12,7 +12,7 @@ dependencies = [
"rich>=13.7",
"markdown>=3.5",
"pyparsing>=3.0.0",
"praisonaiagents>=0.0.33",
"praisonaiagents>=0.0.34",
"python-dotenv>=0.19.0",
"instructor>=1.3.3",
"PyYAML>=6.0",
@@ -84,7 +84,7 @@ autogen = ["pyautogen>=0.2.19", "praisonai-tools>=0.0.7", "crewai"]
[tool.poetry]
name = "PraisonAI"
version = "2.0.43"
version = "2.0.44"
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human–agent collaboration."
authors = ["Mervin Praison"]
license = ""
@@ -102,7 +102,7 @@ python = ">=3.10,<3.13"
rich = ">=13.7"
markdown = ">=3.5"
pyparsing = ">=3.0.0"
praisonaiagents = ">=0.0.33"
praisonaiagents = ">=0.0.34"
python-dotenv = ">=0.19.0"
instructor = ">=1.3.3"
PyYAML = ">=6.0"
Generated
+5 -5
View File
@@ -3060,7 +3060,7 @@ wheels = [
[[package]]
name = "praisonai"
version = "2.0.43"
version = "2.0.44"
source = { editable = "." }
dependencies = [
{ name = "instructor" },
@@ -3197,7 +3197,7 @@ requires-dist = [
{ name = "plotly", marker = "extra == 'realtime'", specifier = ">=5.24.0" },
{ name = "praisonai-tools", marker = "extra == 'autogen'", specifier = ">=0.0.7" },
{ name = "praisonai-tools", marker = "extra == 'crewai'", specifier = ">=0.0.7" },
{ name = "praisonaiagents", specifier = ">=0.0.33" },
{ name = "praisonaiagents", specifier = ">=0.0.34" },
{ name = "pyautogen", marker = "extra == 'autogen'", specifier = ">=0.2.19" },
{ name = "pydantic", marker = "extra == 'chat'", specifier = "<=2.10.1" },
{ name = "pydantic", marker = "extra == 'code'", specifier = "<=2.10.1" },
@@ -3250,16 +3250,16 @@ wheels = [
[[package]]
name = "praisonaiagents"
version = "0.0.33"
version = "0.0.34"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "openai" },
{ name = "pydantic" },
{ name = "rich" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f2/8a/c61b36bf73bebb89054ef83a511bcf2f43c6219e9471514109e238f77c0f/praisonaiagents-0.0.33.tar.gz", hash = "sha256:cf3df6ab44b9f7b38461e6f75e19ff792dc3d1f6a05c8854439c282a2aa701ce", size = 69163 }
sdist = { url = "https://files.pythonhosted.org/packages/cc/98/00ef0d9d50a810f38710647fe2dd6c198b084b787eae5e43307de1b6118b/praisonaiagents-0.0.34.tar.gz", hash = "sha256:1e6e3c37145a1a62030151d014f4f399d9d08a77ee0fd14bcf49f0482bd041fb", size = 69170 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ce/2a/ded102807af9efb0b3e0de86a906d5a0d621eb8aab2be30f9c897aad8054/praisonaiagents-0.0.33-py3-none-any.whl", hash = "sha256:f4491ded47ed879bd39bdfa0cad6589aa69fb6a72ba0f1b1e7d0c9a997824921", size = 85889 },
{ url = "https://files.pythonhosted.org/packages/19/4c/dbb750a2156753ceff051f5ac7b6bba284d1fc57fc9a1aa7fded855009e5/praisonaiagents-0.0.34-py3-none-any.whl", hash = "sha256:a895ee63c73f129d9fa33bbdbe4f13bc5de50509c5565247f640141ef4b8aa8c", size = 85896 },
]
[[package]]