Compare commits

...
1 Commits
Author SHA1 Message Date
Mervin Praison ec6c150315 Release v2.3.72 2025-12-22 13:44:48 +00:00
10 changed files with 52 additions and 40 deletions

No files matched your search

+1 -1
View File
@@ -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.3.71" \
"praisonai>=2.3.72" \
"praisonai[chat]" \
"embedchain[github,youtube]"
+1 -1
View File
@@ -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.3.71" \
"praisonai>=2.3.72" \
"praisonai[ui]" \
"praisonai[chat]" \
"praisonai[realtime]" \
+1 -1
View File
@@ -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.3.71" \
"praisonai>=2.3.72" \
"praisonai[ui]" \
"praisonai[crewai]"
+2 -2
View File
@@ -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.3.71.tar.gz"
sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.3.71.tar.gz | shasum -a 256`.split.first
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.3.72.tar.gz"
sha256 `curl -sL https://github.com/MervinPraison/PraisonAI/archive/refs/tags/v2.3.72.tar.gz | shasum -a 256`.split.first
license "MIT"
depends_on "[email protected]"
@@ -508,7 +508,7 @@ class AgentSchedulerHandler:
return 1
@staticmethod
def handle_schedule_command(args, unknown_args=None) -> int:
def handle_schedule_command(args, unknown_args, daemon_mode=False) -> int:
"""
Handle the schedule command for running agents periodically.
@@ -583,7 +583,7 @@ class AgentSchedulerHandler:
role="Task Executor",
goal=task,
instructions=task,
verbose=False
verbose=True # Enable verbose to see output in logs
)
# Create scheduler
@@ -612,33 +612,38 @@ class AgentSchedulerHandler:
print(f"{'='*60}\n")
# Start scheduler
print("⏰ Starting scheduler... (Press Ctrl+C to stop)\n")
if is_yaml_mode:
scheduler.start_from_yaml_config()
else:
scheduler.start(
schedule_expr=interval,
max_retries=max_retries,
run_immediately=True
)
scheduler.start(schedule_expr=interval, max_retries=max_retries, run_immediately=True)
# Keep running until interrupted
try:
while scheduler.is_running:
import time
time.sleep(1)
except KeyboardInterrupt:
print("\n\n🛑 Stopping scheduler...")
scheduler.stop()
# Display final stats
stats = scheduler.get_stats()
print("\n📊 Final Statistics:")
print(f" Total Executions: {stats['total_executions']}")
print(f" Successful: {stats['successful_executions']}")
print(f" Failed: {stats['failed_executions']}")
print(f" Success Rate: {stats['success_rate']:.1f}%")
print("\n✅ Agent stopped successfully\n")
# If daemon mode, block to keep process alive
if daemon_mode:
import time
try:
while scheduler.is_running:
time.sleep(1)
except KeyboardInterrupt:
scheduler.stop()
else:
# Foreground mode - wait for Ctrl+C
print("⏰ Starting scheduler... (Press Ctrl+C to stop)\n")
import time
try:
while scheduler.is_running:
time.sleep(1)
except KeyboardInterrupt:
print("\n\n🛑 Stopping scheduler...")
scheduler.stop()
# Display final stats
stats = scheduler.get_stats()
print("\n📊 Final Statistics:")
print(f" Total Executions: {stats['total_executions']}")
print(f" Successful: {stats['successful_executions']}")
print(f" Failed: {stats['failed_executions']}")
print(f" Success Rate: {stats['success_rate']:.1f}%")
print("\n✅ Agent stopped successfully\n")
return 0
+5 -3
View File
@@ -239,8 +239,9 @@ class PraisonAI:
if subcommand in ['start', 'list', 'stop', 'logs', 'restart', 'delete', 'describe', 'save', 'stop-all', 'stats']:
exit_code = AgentSchedulerHandler.handle_daemon_command(subcommand, args, unknown_args[1:] if len(unknown_args) > 1 else [])
else:
# Legacy mode: direct scheduling (foreground)
exit_code = AgentSchedulerHandler.handle_schedule_command(args, unknown_args)
# Legacy mode: direct scheduling (foreground) or daemon mode
daemon_mode = getattr(args, 'daemon', False)
exit_code = AgentSchedulerHandler.handle_schedule_command(args, unknown_args, daemon_mode=daemon_mode)
sys.exit(exit_code)
elif args.command.startswith("tests.test") or args.command.startswith("tests/test"): # Argument used for testing purposes
@@ -734,7 +735,8 @@ class PraisonAI:
parser.add_argument("--interval", dest="schedule_interval", type=str, help="Schedule interval (e.g., 'hourly', '*/30m', 'daily')")
parser.add_argument("--schedule-max-retries", dest="schedule_max_retries", type=int, help="Maximum retry attempts for scheduled execution")
parser.add_argument("--timeout", type=int, help="Maximum execution time per run in seconds")
parser.add_argument("--max-cost", dest="max_cost", type=float, help="Maximum total cost budget in USD")
parser.add_argument('--max-cost', type=float, help='Maximum total cost budget in USD')
parser.add_argument('--daemon', action='store_true', help=argparse.SUPPRESS) # Hidden flag for daemon mode
# If we're in a test environment, parse with empty args to avoid pytest interference
if in_test_env:
+1 -1
View File
@@ -57,7 +57,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.3.71 gunicorn markdown\n")
file.write("RUN pip install flask praisonai==2.3.72 gunicorn markdown\n")
file.write("EXPOSE 8080\n")
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
@@ -279,6 +279,9 @@ class AgentScheduler:
self.on_success(result)
except Exception as e:
logger.error(f"Callback error in on_success: {e}")
# Update state file after successful execution
self._update_state_if_daemon()
break
@@ -302,6 +305,9 @@ class AgentScheduler:
self.on_failure(f"Failed after {max_retries} attempts")
except Exception as e:
logger.error(f"Callback error in on_failure: {e}")
# Update state file even after failure
self._update_state_if_daemon()
def execute_once(self) -> Any:
"""
@@ -50,7 +50,7 @@ class DaemonManager:
"""
log_file = self.log_dir / f"{name}.log"
# Open log file
# Open log file - use original working approach
with open(log_file, 'a') as log:
log.flush()
@@ -89,16 +89,15 @@ class DaemonManager:
Returns:
Process ID
"""
# Build command - use praisonai CLI to run scheduler in foreground
# Build command - use CLI without --daemon flag (original working approach)
command = [
sys.executable,
"-m",
"praisonai.cli.main",
"schedule",
f'"{task}"', # Quote the task
task,
"--interval", interval,
"--max-retries", str(max_retries),
"--verbose" # Enable verbose to see output
"--max-retries", str(max_retries)
]
if timeout:
+1 -1
View File
@@ -1 +1 @@
__version__ = "2.3.71"
__version__ = "2.3.72"