From 6fd84f27bae1c1a8a24be45976715da9659113e9 Mon Sep 17 00:00:00 2001 From: MervinPraison Date: Thu, 5 Jun 2025 17:53:38 +0100 Subject: [PATCH 1/2] Update versioning and dependencies in project files - Incremented version of PraisonAI from 0.0.99 to 0.0.101 in pyproject.toml and uv.lock. - Added 'litellm' dependency to memory requirements for enhanced functionality. - Updated .gitignore to include 'CopilotKit*' for better file management. - Optimised TaskOutput instantiation in agent.py for clarity. - Refined memory handling in memory.py to utilise LiteLLM for consistency. - Improved model extraction logic in task.py for better fallback handling. --- .gitignore | 3 +- .../guardrail_agent_example.py | 14 ++++++++ .../praisonaiagents/agent/agent.py | 7 ++-- .../praisonaiagents/memory/memory.py | 11 ++++--- .../praisonaiagents/task/task.py | 6 +++- src/praisonai-agents/pyproject.toml | 10 +++--- src/praisonai-agents/test.py | 33 +++++++++++++++++++ src/praisonai-agents/uv.lock | 4 ++- 8 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 src/praisonai-agents/guardrail_agent_example.py create mode 100644 src/praisonai-agents/test.py diff --git a/.gitignore b/.gitignore index 9346c7357..5fbb6b54e 100644 --- a/.gitignore +++ b/.gitignore @@ -74,4 +74,5 @@ agents/praisonaiagents/praisonaiagents.egg-info .praison # Local Netlify folder .netlify -.qodo \ No newline at end of file +.qodo +CopilotKit* \ No newline at end of file diff --git a/src/praisonai-agents/guardrail_agent_example.py b/src/praisonai-agents/guardrail_agent_example.py new file mode 100644 index 000000000..a5a77f511 --- /dev/null +++ b/src/praisonai-agents/guardrail_agent_example.py @@ -0,0 +1,14 @@ +from praisonaiagents import Agent + +def validate_content(data): + if len(str(data)) < 50: + return False, "Content too short" + return True, data + +agent = Agent( + instructions="You are a writer", + guardrail=validate_content, + max_guardrail_retries=1 +) + +agent.start("Write a welcome message with 5 words") \ No newline at end of file diff --git a/src/praisonai-agents/praisonaiagents/agent/agent.py b/src/praisonai-agents/praisonaiagents/agent/agent.py index de818be6e..6b877c801 100644 --- a/src/praisonai-agents/praisonaiagents/agent/agent.py +++ b/src/praisonai-agents/praisonaiagents/agent/agent.py @@ -619,12 +619,9 @@ def _apply_guardrail_with_retry(self, response_text, prompt, temperature=0.2, to while retry_count <= self.max_guardrail_retries: # Create TaskOutput object task_output = TaskOutput( + description="Agent response output", raw=current_response, - output=current_response, - pydantic=None, - json_dict=None, - name=f"{self.name}_output", - description="Agent response output" + agent=self.name ) # Process guardrail diff --git a/src/praisonai-agents/praisonaiagents/memory/memory.py b/src/praisonai-agents/praisonaiagents/memory/memory.py index 36c245a21..7a5a8a1b9 100644 --- a/src/praisonai-agents/praisonaiagents/memory/memory.py +++ b/src/praisonai-agents/praisonaiagents/memory/memory.py @@ -910,11 +910,14 @@ def calculate_quality_metrics( """ try: - # Use OpenAI client from main.py - from ..main import client + # Use LiteLLM for consistency with the rest of the codebase + import litellm - response = client.chat.completions.create( - model=llm or "gpt-4o", + # Convert model name if it's in litellm format + model_name = llm or "gpt-4o-mini" + + response = litellm.completion( + model=model_name, messages=[{ "role": "user", "content": custom_prompt or default_prompt diff --git a/src/praisonai-agents/praisonaiagents/task/task.py b/src/praisonai-agents/praisonaiagents/task/task.py index 4efaa4e5d..36c0bccea 100644 --- a/src/praisonai-agents/praisonaiagents/task/task.py +++ b/src/praisonai-agents/praisonaiagents/task/task.py @@ -308,7 +308,11 @@ async def execute_callback(self, task_output: TaskOutput) -> None: if self.agent: if getattr(self.agent, '_using_custom_llm', False) and hasattr(self.agent, 'llm_instance'): # For custom LLM instances (like Ollama) - llm_model = self.agent.llm_instance + # Extract the model name from the LLM instance + if hasattr(self.agent.llm_instance, 'model'): + llm_model = self.agent.llm_instance.model + else: + llm_model = "gpt-4o-mini" # Default fallback elif hasattr(self.agent, 'llm') and self.agent.llm: # For standard model strings llm_model = self.agent.llm diff --git a/src/praisonai-agents/pyproject.toml b/src/praisonai-agents/pyproject.toml index c14bd21a2..79c807e93 100644 --- a/src/praisonai-agents/pyproject.toml +++ b/src/praisonai-agents/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "praisonaiagents" -version = "0.0.99" +version = "0.0.101" description = "Praison AI agents for completing complex tasks with Self Reflection Agents" requires-python = ">=3.10" authors = [ @@ -25,7 +25,8 @@ mcp = [ ] memory = [ - "chromadb>=1.0.0" + "chromadb>=1.0.0", + "litellm>=1.50.0", ] knowledge = [ @@ -63,5 +64,6 @@ all = [ "praisonaiagents[api]" ] -[tool.setuptools] -packages = ["praisonaiagents"] \ No newline at end of file +[tool.setuptools.packages.find] +where = ["."] +include = ["praisonaiagents*"] \ No newline at end of file diff --git a/src/praisonai-agents/test.py b/src/praisonai-agents/test.py new file mode 100644 index 000000000..1bc49e131 --- /dev/null +++ b/src/praisonai-agents/test.py @@ -0,0 +1,33 @@ +from praisonaiagents import Agent, Task, PraisonAIAgents +import os +from dotenv import load_dotenv + +load_dotenv() + +llm_config = { + "model": "openai/gpt-4o-mini", + "api_key": os.getenv('OPENAI_API_KEY'), + "temperature": 0.7, + "max_tokens": 2000 +} + +blog_agent = Agent( + role="Blog Writer", + goal="Write a blog post about AI", + backstory="Expert at writing blog posts", + llm="gpt-4o-mini", +) + +blog_task = Task( + description="Write a blog post about AI trends in 1 paragraph", + expected_output="Well-written blog post about AI trends", + agent=blog_agent +) + +agents = PraisonAIAgents( + agents=[blog_agent], + tasks=[blog_task], + memory=True +) + +result = agents.start() diff --git a/src/praisonai-agents/uv.lock b/src/praisonai-agents/uv.lock index 35725eb59..1c6054173 100644 --- a/src/praisonai-agents/uv.lock +++ b/src/praisonai-agents/uv.lock @@ -2398,7 +2398,7 @@ wheels = [ [[package]] name = "praisonaiagents" -version = "0.0.99" +version = "0.0.101" source = { editable = "." } dependencies = [ { name = "mcp" }, @@ -2444,6 +2444,7 @@ mcp = [ ] memory = [ { name = "chromadb" }, + { name = "litellm" }, ] [package.metadata] @@ -2455,6 +2456,7 @@ requires-dist = [ { name = "fastapi", marker = "extra == 'api'", specifier = ">=0.115.0" }, { name = "fastapi", marker = "extra == 'mcp'", specifier = ">=0.115.0" }, { name = "litellm", marker = "extra == 'llm'", specifier = ">=1.50.0" }, + { name = "litellm", marker = "extra == 'memory'", specifier = ">=1.50.0" }, { name = "markitdown", extras = ["all"], marker = "extra == 'knowledge'", specifier = ">=0.1.0" }, { name = "mcp", specifier = ">=1.6.0" }, { name = "mcp", marker = "extra == 'mcp'", specifier = ">=1.6.0" }, From ee85a6372144cdb30fe33313f67a0537a915e2fa Mon Sep 17 00:00:00 2001 From: MervinPraison Date: Thu, 5 Jun 2025 17:54:57 +0100 Subject: [PATCH 2/2] Update PraisonAI version to 2.2.29 across Dockerfiles and related files - Incremented the version of PraisonAI from 2.2.28 to 2.2.29 in Dockerfiles (Dockerfile, Dockerfile.chat, Dockerfile.dev, Dockerfile.ui). - Updated the version in the README.md and pyproject.toml files to reflect the new version. - Adjusted the deploy.py script to install the updated version of PraisonAI. - Ensured consistency across all relevant files for seamless integration. --- docker/Dockerfile | 2 +- docker/Dockerfile.chat | 2 +- docker/Dockerfile.dev | 2 +- docker/Dockerfile.ui | 2 +- docker/README.md | 4 ++-- src/praisonai/praisonai.rb | 4 ++-- src/praisonai/praisonai/deploy.py | 2 +- src/praisonai/pyproject.toml | 8 ++++---- src/praisonai/uv.lock | 10 +++++----- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 18ca1a1db..45747625c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison # Install Python packages (using latest versions) RUN pip install --no-cache-dir \ flask \ - "praisonai>=2.2.28" \ + "praisonai>=2.2.29" \ "praisonai[api]" \ gunicorn \ markdown diff --git a/docker/Dockerfile.chat b/docker/Dockerfile.chat index 4f588fa1f..a6f4840a8 100644 --- a/docker/Dockerfile.chat +++ b/docker/Dockerfile.chat @@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison # Install Python packages (using latest versions) RUN pip install --no-cache-dir \ praisonai_tools \ - "praisonai>=2.2.28" \ + "praisonai>=2.2.29" \ "praisonai[chat]" \ "embedchain[github,youtube]" diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index b5601a3a2..c66ffee8f 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -20,7 +20,7 @@ RUN mkdir -p /root/.praison # Install Python packages (using latest versions) RUN pip install --no-cache-dir \ praisonai_tools \ - "praisonai>=2.2.28" \ + "praisonai>=2.2.29" \ "praisonai[ui]" \ "praisonai[chat]" \ "praisonai[realtime]" \ diff --git a/docker/Dockerfile.ui b/docker/Dockerfile.ui index d96c34d6f..644c9cef3 100644 --- a/docker/Dockerfile.ui +++ b/docker/Dockerfile.ui @@ -16,7 +16,7 @@ RUN mkdir -p /root/.praison # Install Python packages (using latest versions) RUN pip install --no-cache-dir \ praisonai_tools \ - "praisonai>=2.2.28" \ + "praisonai>=2.2.29" \ "praisonai[ui]" \ "praisonai[crewai]" diff --git a/docker/README.md b/docker/README.md index a436287b0..f6d3b2ef0 100644 --- a/docker/README.md +++ b/docker/README.md @@ -121,7 +121,7 @@ healthcheck: ## 📦 Package Versions All Docker images use consistent, up-to-date versions: -- PraisonAI: `>=2.2.28` +- PraisonAI: `>=2.2.29` - PraisonAI Agents: `>=0.0.92` - Python: `3.11-slim` @@ -218,7 +218,7 @@ docker-compose up -d ### Version Pinning To use specific versions, update the Dockerfile: ```dockerfile -RUN pip install "praisonai==2.2.28" "praisonaiagents==0.0.92" +RUN pip install "praisonai==2.2.29" "praisonaiagents==0.0.92" ``` ## 🌐 Production Deployment diff --git a/src/praisonai/praisonai.rb b/src/praisonai/praisonai.rb index 52841970b..7c78ee414 100644 --- a/src/praisonai/praisonai.rb +++ b/src/praisonai/praisonai.rb @@ -3,8 +3,8 @@ 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/v2.2.28.tar.gz" - sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.2.28.tar.gz | shasum -a 256`.split.first + url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.2.29.tar.gz" + sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.2.29.tar.gz | shasum -a 256`.split.first license "MIT" depends_on "python@3.11" diff --git a/src/praisonai/praisonai/deploy.py b/src/praisonai/praisonai/deploy.py index bc0d09e4f..df2cf1552 100644 --- a/src/praisonai/praisonai/deploy.py +++ b/src/praisonai/praisonai/deploy.py @@ -56,7 +56,7 @@ def create_dockerfile(self): 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.2.28 gunicorn markdown\n") + file.write("RUN pip install flask praisonai==2.2.29 gunicorn markdown\n") file.write("EXPOSE 8080\n") file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n') diff --git a/src/praisonai/pyproject.toml b/src/praisonai/pyproject.toml index 7f8926a3a..4065f6a36 100644 --- a/src/praisonai/pyproject.toml +++ b/src/praisonai/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "PraisonAI" -version = "2.2.28" +version = "2.2.29" 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.99", + "praisonaiagents>=0.0.101", "python-dotenv>=0.19.0", "instructor>=1.3.3", "PyYAML>=6.0", @@ -95,7 +95,7 @@ autogen = ["pyautogen>=0.2.19", "praisonai-tools>=0.0.15", "crewai"] [tool.poetry] name = "PraisonAI" -version = "2.2.28" +version = "2.2.29" 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 = "" @@ -113,7 +113,7 @@ python = ">=3.10,<3.13" rich = ">=13.7" markdown = ">=3.5" pyparsing = ">=3.0.0" -praisonaiagents = ">=0.0.99" +praisonaiagents = ">=0.0.101" python-dotenv = ">=0.19.0" instructor = ">=1.3.3" PyYAML = ">=6.0" diff --git a/src/praisonai/uv.lock b/src/praisonai/uv.lock index cda9dca90..903a9b8ec 100644 --- a/src/praisonai/uv.lock +++ b/src/praisonai/uv.lock @@ -3931,7 +3931,7 @@ wheels = [ [[package]] name = "praisonai" -version = "2.2.28" +version = "2.2.29" source = { editable = "." } dependencies = [ { name = "instructor" }, @@ -4073,7 +4073,7 @@ requires-dist = [ { name = "plotly", marker = "extra == 'realtime'", specifier = ">=5.24.0" }, { name = "praisonai-tools", marker = "extra == 'autogen'", specifier = ">=0.0.15" }, { name = "praisonai-tools", marker = "extra == 'crewai'", specifier = ">=0.0.15" }, - { name = "praisonaiagents", specifier = ">=0.0.99" }, + { name = "praisonaiagents", specifier = ">=0.0.101" }, { 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" }, @@ -4130,7 +4130,7 @@ wheels = [ [[package]] name = "praisonaiagents" -version = "0.0.99" +version = "0.0.101" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mcp" }, @@ -4138,9 +4138,9 @@ dependencies = [ { name = "pydantic" }, { name = "rich" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0e/c9/61a2a5ba41a1a81f93101a14bd2c4399139dd2b37782651e46a579a3b23c/praisonaiagents-0.0.99.tar.gz", hash = "sha256:acc6f00cc0c7e6193535a69a12d5cfbccdeb52bf38b7944019a1ef30b7411251", size = 140604 } +sdist = { url = "https://files.pythonhosted.org/packages/6a/20/5b34f6a42752a0033034483ef116d419e5b0c51a5bcb92aa285312a62466/praisonaiagents-0.0.101.tar.gz", hash = "sha256:55d2a79726aac286a93815768a6cfa04c821f430370f276b18e5a2aab698aa2b", size = 145011 } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/df/b86106a107c6a9f16dbaba4f516f054f1569a8c02a6d05cecf8f0adcaee2/praisonaiagents-0.0.99-py3-none-any.whl", hash = "sha256:d8724d66900d4c6a9219d8e56575c9d542a1843592159abb8a6bf82618e801ba", size = 158680 }, + { url = "https://files.pythonhosted.org/packages/89/57/3f17cc757f6c12125a6a6e3518d8221ba74bae10d5512362134db6dda8b5/praisonaiagents-0.0.101-py3-none-any.whl", hash = "sha256:4c6174b50e6084cf375b1eef196dfc4f48c72b82d1edf043660d48754558e14c", size = 164959 }, ] [[package]]