praisonAI 2.3.71__tar.gz → 2.3.72__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. {praisonai-2.3.71 → praisonai-2.3.72}/PKG-INFO +1 -1
  2. {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/PKG-INFO +1 -1
  3. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/agent_scheduler.py +30 -25
  4. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/main.py +5 -3
  5. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/deploy.py +1 -1
  6. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/agent_scheduler.py +6 -0
  7. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/daemon_manager.py +4 -5
  8. praisonai-2.3.72/praisonai/version.py +1 -0
  9. praisonai-2.3.71/praisonai/version.py +0 -1
  10. {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/SOURCES.txt +0 -0
  11. {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/dependency_links.txt +0 -0
  12. {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/entry_points.txt +0 -0
  13. {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/requires.txt +0 -0
  14. {praisonai-2.3.71 → praisonai-2.3.72}/PraisonAI.egg-info/top_level.txt +0 -0
  15. {praisonai-2.3.71 → praisonai-2.3.72}/README.md +0 -0
  16. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/__init__.py +0 -0
  17. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/__main__.py +0 -0
  18. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/agent_scheduler.py +0 -0
  19. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/agents_generator.py +0 -0
  20. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/api/call.py +0 -0
  21. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/auto.py +0 -0
  22. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/chainlit_ui.py +0 -0
  23. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/__init__.py +0 -0
  24. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/__init__.py +0 -0
  25. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/at_mentions.py +0 -0
  26. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/auto_memory.py +0 -0
  27. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/autonomy_mode.py +0 -0
  28. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/base.py +0 -0
  29. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/cost_tracker.py +0 -0
  30. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/external_agents.py +0 -0
  31. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/fast_context.py +0 -0
  32. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/flow_display.py +0 -0
  33. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/git_integration.py +0 -0
  34. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/guardrail.py +0 -0
  35. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/handoff.py +0 -0
  36. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/image.py +0 -0
  37. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/interactive_tui.py +0 -0
  38. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/knowledge.py +0 -0
  39. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/mcp.py +0 -0
  40. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/message_queue.py +0 -0
  41. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/metrics.py +0 -0
  42. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/n8n.py +0 -0
  43. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/repo_map.py +0 -0
  44. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/router.py +0 -0
  45. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/sandbox_executor.py +0 -0
  46. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/session.py +0 -0
  47. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/slash_commands.py +0 -0
  48. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/telemetry.py +0 -0
  49. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/todo.py +0 -0
  50. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/tools.py +0 -0
  51. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/features/workflow.py +0 -0
  52. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/cli/schedule_cli.py +0 -0
  53. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/__init__.py +0 -0
  54. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/agent_tools.py +0 -0
  55. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/diff/__init__.py +0 -0
  56. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/diff/diff_strategy.py +0 -0
  57. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/__init__.py +0 -0
  58. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/apply_diff.py +0 -0
  59. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/execute_command.py +0 -0
  60. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/list_files.py +0 -0
  61. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/read_file.py +0 -0
  62. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/search_replace.py +0 -0
  63. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/tools/write_file.py +0 -0
  64. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/__init__.py +0 -0
  65. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/file_utils.py +0 -0
  66. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/ignore_utils.py +0 -0
  67. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/code/utils/text_utils.py +0 -0
  68. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inbuilt_tools/__init__.py +0 -0
  69. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  70. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inc/__init__.py +0 -0
  71. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inc/config.py +0 -0
  72. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/inc/models.py +0 -0
  73. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/__init__.py +0 -0
  74. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/base.py +0 -0
  75. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/claude_code.py +0 -0
  76. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/codex_cli.py +0 -0
  77. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/cursor_cli.py +0 -0
  78. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/integrations/gemini_cli.py +0 -0
  79. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/profiler.py +0 -0
  80. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/__init__.py +0 -0
  81. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/base.py +0 -0
  82. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/state_manager.py +0 -0
  83. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler/yaml_loader.py +0 -0
  84. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/scheduler.py +0 -0
  85. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/__init__.py +0 -0
  86. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/build.py +0 -0
  87. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/post_install.py +0 -0
  88. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup/setup_conda_env.py +0 -0
  89. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/setup.py +0 -0
  90. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/test.py +0 -0
  91. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/train.py +0 -0
  92. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/train_vision.py +0 -0
  93. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/agents.py +0 -0
  94. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/callbacks.py +0 -0
  95. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/chat.py +0 -0
  96. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/code.py +0 -0
  97. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/colab.py +0 -0
  98. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/colab_chainlit.py +0 -0
  99. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/components/aicoder.py +0 -0
  100. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/context.py +0 -0
  101. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/database_config.py +0 -0
  102. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/db.py +0 -0
  103. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/realtime.py +0 -0
  104. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/realtimeclient/__init__.py +0 -0
  105. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/realtimeclient/tools.py +0 -0
  106. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/ui/sql_alchemy.py +0 -0
  107. {praisonai-2.3.71 → praisonai-2.3.72}/praisonai/upload_vision.py +0 -0
  108. {praisonai-2.3.71 → praisonai-2.3.72}/pyproject.toml +0 -0
  109. {praisonai-2.3.71 → praisonai-2.3.72}/setup.cfg +0 -0
  110. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test.py +0 -0
  111. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_agents_playbook.py +0 -0
  112. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_approval_system.py +0 -0
  113. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_basic.py +0 -0
  114. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_cli_features.py +0 -0
  115. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_custom_tools_fix.py +0 -0
  116. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_double_api_fix.py +0 -0
  117. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_n8n_integration.py +0 -0
  118. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_phase2_refactor.py +0 -0
  119. {praisonai-2.3.71 → praisonai-2.3.72}/tests/test_runner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 2.3.71
3
+ Version: 2.3.72
4
4
  Summary: 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.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 2.3.71
3
+ Version: 2.3.72
4
4
  Summary: 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.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -508,7 +508,7 @@ class AgentSchedulerHandler:
508
508
  return 1
509
509
 
510
510
  @staticmethod
511
- def handle_schedule_command(args, unknown_args=None) -> int:
511
+ def handle_schedule_command(args, unknown_args, daemon_mode=False) -> int:
512
512
  """
513
513
  Handle the schedule command for running agents periodically.
514
514
 
@@ -583,7 +583,7 @@ class AgentSchedulerHandler:
583
583
  role="Task Executor",
584
584
  goal=task,
585
585
  instructions=task,
586
- verbose=False
586
+ verbose=True # Enable verbose to see output in logs
587
587
  )
588
588
 
589
589
  # Create scheduler
@@ -612,33 +612,38 @@ class AgentSchedulerHandler:
612
612
  print(f"{'='*60}\n")
613
613
 
614
614
  # Start scheduler
615
- print("⏰ Starting scheduler... (Press Ctrl+C to stop)\n")
616
615
  if is_yaml_mode:
617
616
  scheduler.start_from_yaml_config()
618
617
  else:
619
- scheduler.start(
620
- schedule_expr=interval,
621
- max_retries=max_retries,
622
- run_immediately=True
623
- )
618
+ scheduler.start(schedule_expr=interval, max_retries=max_retries, run_immediately=True)
624
619
 
625
- # Keep running until interrupted
626
- try:
627
- while scheduler.is_running:
628
- import time
629
- time.sleep(1)
630
- except KeyboardInterrupt:
631
- print("\n\n🛑 Stopping scheduler...")
632
- scheduler.stop()
633
-
634
- # Display final stats
635
- stats = scheduler.get_stats()
636
- print("\n📊 Final Statistics:")
637
- print(f" Total Executions: {stats['total_executions']}")
638
- print(f" Successful: {stats['successful_executions']}")
639
- print(f" Failed: {stats['failed_executions']}")
640
- print(f" Success Rate: {stats['success_rate']:.1f}%")
641
- print("\n✅ Agent stopped successfully\n")
620
+ # If daemon mode, block to keep process alive
621
+ if daemon_mode:
622
+ import time
623
+ try:
624
+ while scheduler.is_running:
625
+ time.sleep(1)
626
+ except KeyboardInterrupt:
627
+ scheduler.stop()
628
+ else:
629
+ # Foreground mode - wait for Ctrl+C
630
+ print("⏰ Starting scheduler... (Press Ctrl+C to stop)\n")
631
+ import time
632
+ try:
633
+ while scheduler.is_running:
634
+ time.sleep(1)
635
+ except KeyboardInterrupt:
636
+ print("\n\n🛑 Stopping scheduler...")
637
+ scheduler.stop()
638
+
639
+ # Display final stats
640
+ stats = scheduler.get_stats()
641
+ print("\n📊 Final Statistics:")
642
+ print(f" Total Executions: {stats['total_executions']}")
643
+ print(f" Successful: {stats['successful_executions']}")
644
+ print(f" Failed: {stats['failed_executions']}")
645
+ print(f" Success Rate: {stats['success_rate']:.1f}%")
646
+ print("\n✅ Agent stopped successfully\n")
642
647
 
643
648
  return 0
644
649
 
@@ -239,8 +239,9 @@ class PraisonAI:
239
239
  if subcommand in ['start', 'list', 'stop', 'logs', 'restart', 'delete', 'describe', 'save', 'stop-all', 'stats']:
240
240
  exit_code = AgentSchedulerHandler.handle_daemon_command(subcommand, args, unknown_args[1:] if len(unknown_args) > 1 else [])
241
241
  else:
242
- # Legacy mode: direct scheduling (foreground)
243
- exit_code = AgentSchedulerHandler.handle_schedule_command(args, unknown_args)
242
+ # Legacy mode: direct scheduling (foreground) or daemon mode
243
+ daemon_mode = getattr(args, 'daemon', False)
244
+ exit_code = AgentSchedulerHandler.handle_schedule_command(args, unknown_args, daemon_mode=daemon_mode)
244
245
 
245
246
  sys.exit(exit_code)
246
247
  elif args.command.startswith("tests.test") or args.command.startswith("tests/test"): # Argument used for testing purposes
@@ -734,7 +735,8 @@ class PraisonAI:
734
735
  parser.add_argument("--interval", dest="schedule_interval", type=str, help="Schedule interval (e.g., 'hourly', '*/30m', 'daily')")
735
736
  parser.add_argument("--schedule-max-retries", dest="schedule_max_retries", type=int, help="Maximum retry attempts for scheduled execution")
736
737
  parser.add_argument("--timeout", type=int, help="Maximum execution time per run in seconds")
737
- parser.add_argument("--max-cost", dest="max_cost", type=float, help="Maximum total cost budget in USD")
738
+ parser.add_argument('--max-cost', type=float, help='Maximum total cost budget in USD')
739
+ parser.add_argument('--daemon', action='store_true', help=argparse.SUPPRESS) # Hidden flag for daemon mode
738
740
 
739
741
  # If we're in a test environment, parse with empty args to avoid pytest interference
740
742
  if in_test_env:
@@ -57,7 +57,7 @@ class CloudDeployer:
57
57
  file.write("FROM python:3.11-slim\n")
58
58
  file.write("WORKDIR /app\n")
59
59
  file.write("COPY . .\n")
60
- file.write("RUN pip install flask praisonai==2.3.71 gunicorn markdown\n")
60
+ file.write("RUN pip install flask praisonai==2.3.72 gunicorn markdown\n")
61
61
  file.write("EXPOSE 8080\n")
62
62
  file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
63
63
 
@@ -279,6 +279,9 @@ class AgentScheduler:
279
279
  self.on_success(result)
280
280
  except Exception as e:
281
281
  logger.error(f"Callback error in on_success: {e}")
282
+
283
+ # Update state file after successful execution
284
+ self._update_state_if_daemon()
282
285
 
283
286
  break
284
287
 
@@ -302,6 +305,9 @@ class AgentScheduler:
302
305
  self.on_failure(f"Failed after {max_retries} attempts")
303
306
  except Exception as e:
304
307
  logger.error(f"Callback error in on_failure: {e}")
308
+
309
+ # Update state file even after failure
310
+ self._update_state_if_daemon()
305
311
 
306
312
  def execute_once(self) -> Any:
307
313
  """
@@ -50,7 +50,7 @@ class DaemonManager:
50
50
  """
51
51
  log_file = self.log_dir / f"{name}.log"
52
52
 
53
- # Open log file
53
+ # Open log file - use original working approach
54
54
  with open(log_file, 'a') as log:
55
55
  log.flush()
56
56
 
@@ -89,16 +89,15 @@ class DaemonManager:
89
89
  Returns:
90
90
  Process ID
91
91
  """
92
- # Build command - use praisonai CLI to run scheduler in foreground
92
+ # Build command - use CLI without --daemon flag (original working approach)
93
93
  command = [
94
94
  sys.executable,
95
95
  "-m",
96
96
  "praisonai.cli.main",
97
97
  "schedule",
98
- f'"{task}"', # Quote the task
98
+ task,
99
99
  "--interval", interval,
100
- "--max-retries", str(max_retries),
101
- "--verbose" # Enable verbose to see output
100
+ "--max-retries", str(max_retries)
102
101
  ]
103
102
 
104
103
  if timeout:
@@ -0,0 +1 @@
1
+ __version__ = "2.3.72"
@@ -1 +0,0 @@
1
- __version__ = "2.3.71"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes