PraisonAI 2.3.59__tar.gz → 2.3.60__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.
- {praisonai-2.3.59 → praisonai-2.3.60}/PKG-INFO +1 -1
- {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/PKG-INFO +1 -1
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/main.py +69 -2
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/deploy.py +1 -1
- praisonai-2.3.60/praisonai/version.py +1 -0
- praisonai-2.3.59/praisonai/version.py +0 -1
- {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/requires.txt +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/README.md +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/__main__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/agents_generator.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/api/call.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/auto.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/chainlit_ui.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/at_mentions.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/auto_memory.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/autonomy_mode.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/base.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/cost_tracker.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/external_agents.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/fast_context.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/flow_display.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/git_integration.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/guardrail.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/handoff.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/image.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/interactive_tui.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/knowledge.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/mcp.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/message_queue.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/metrics.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/n8n.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/repo_map.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/router.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/sandbox_executor.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/session.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/slash_commands.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/telemetry.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/todo.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/tools.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/agent_tools.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inc/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inc/config.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inc/models.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/base.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/profiler.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/scheduler.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/build.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/post_install.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/test.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/train.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/train_vision.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/agents.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/callbacks.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/chat.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/code.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/colab.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/colab_chainlit.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/components/aicoder.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/context.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/database_config.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/db.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/realtime.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/realtimeclient/__init__.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/realtimeclient/tools.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/sql_alchemy.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/upload_vision.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/pyproject.toml +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/setup.cfg +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_agents_playbook.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_approval_system.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_basic.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_cli_features.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_double_api_fix.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_n8n_integration.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_phase2_refactor.py +0 -0
- {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_runner.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.60
|
|
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.
|
|
3
|
+
Version: 2.3.60
|
|
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
|
|
@@ -3021,7 +3021,8 @@ Provide ONLY the commit message, no explanations."""
|
|
|
3021
3021
|
if tool_level_value <= max_level_value:
|
|
3022
3022
|
return ApprovalDecision(approved=True, reason=f"Auto-approved (level {risk_level} <= {max_level})")
|
|
3023
3023
|
else:
|
|
3024
|
-
#
|
|
3024
|
+
# Signal to pause Live display before showing approval prompt
|
|
3025
|
+
# This is handled by the approval_pending flag in status_info
|
|
3025
3026
|
from praisonaiagents.approval import console_approval_callback
|
|
3026
3027
|
return console_approval_callback(function_name, arguments, risk_level)
|
|
3027
3028
|
|
|
@@ -3297,7 +3298,9 @@ Now, {final_instruction.lower()}:"""
|
|
|
3297
3298
|
'result': None,
|
|
3298
3299
|
'error': None,
|
|
3299
3300
|
'start_time': time.time(),
|
|
3300
|
-
'available_tools': tool_names
|
|
3301
|
+
'available_tools': tool_names,
|
|
3302
|
+
'approval_pending': False, # Flag to pause Live display during approval
|
|
3303
|
+
'live_instance': None # Reference to Live instance for stopping
|
|
3301
3304
|
}
|
|
3302
3305
|
|
|
3303
3306
|
def tool_call_callback(message):
|
|
@@ -3360,6 +3363,53 @@ Now, {final_instruction.lower()}:"""
|
|
|
3360
3363
|
finally:
|
|
3361
3364
|
status_info['done'] = True
|
|
3362
3365
|
|
|
3366
|
+
# Set up approval callback that stops Live display before prompting
|
|
3367
|
+
# Only if not using --trust (which auto-approves everything)
|
|
3368
|
+
if not getattr(self.args, 'trust', False):
|
|
3369
|
+
from praisonaiagents.approval import set_approval_callback, ApprovalDecision
|
|
3370
|
+
from rich.prompt import Confirm
|
|
3371
|
+
from rich.panel import Panel
|
|
3372
|
+
|
|
3373
|
+
def cli_approval_with_live_pause(function_name, arguments, risk_level):
|
|
3374
|
+
"""Approval callback that stops Live display before prompting."""
|
|
3375
|
+
# Signal to stop Live display
|
|
3376
|
+
status_info['approval_pending'] = True
|
|
3377
|
+
|
|
3378
|
+
# Wait a moment for Live to stop
|
|
3379
|
+
time.sleep(0.2)
|
|
3380
|
+
|
|
3381
|
+
# Now show the approval prompt
|
|
3382
|
+
risk_colors = {"critical": "bold red", "high": "red", "medium": "yellow", "low": "blue"}
|
|
3383
|
+
risk_color = risk_colors.get(risk_level, "white")
|
|
3384
|
+
|
|
3385
|
+
tool_info = f"[bold]Function:[/] {function_name}\n"
|
|
3386
|
+
tool_info += f"[bold]Risk Level:[/] [{risk_color}]{risk_level.upper()}[/{risk_color}]\n"
|
|
3387
|
+
tool_info += "[bold]Arguments:[/]\n"
|
|
3388
|
+
for key, value in arguments.items():
|
|
3389
|
+
str_value = str(value)[:100] + "..." if len(str(value)) > 100 else str(value)
|
|
3390
|
+
tool_info += f" {key}: {str_value}\n"
|
|
3391
|
+
|
|
3392
|
+
console.print(Panel(tool_info.strip(), title="🔒 Tool Approval Required", border_style=risk_color))
|
|
3393
|
+
|
|
3394
|
+
try:
|
|
3395
|
+
approved = Confirm.ask(f"[{risk_color}]Execute this {risk_level} risk tool?[/{risk_color}]", default=False)
|
|
3396
|
+
status_info['approval_pending'] = False
|
|
3397
|
+
|
|
3398
|
+
if approved:
|
|
3399
|
+
console.print("[green]✅ Approved[/green]")
|
|
3400
|
+
return ApprovalDecision(approved=True, reason="User approved")
|
|
3401
|
+
else:
|
|
3402
|
+
console.print("[red]❌ Denied[/red]")
|
|
3403
|
+
return ApprovalDecision(approved=False, reason="User denied")
|
|
3404
|
+
except (KeyboardInterrupt, EOFError):
|
|
3405
|
+
status_info['approval_pending'] = False
|
|
3406
|
+
console.print("\n[red]❌ Cancelled[/red]")
|
|
3407
|
+
return ApprovalDecision(approved=False, reason="User cancelled")
|
|
3408
|
+
|
|
3409
|
+
# Only set if not already set by --approve-level
|
|
3410
|
+
if not getattr(self.args, 'approve_level', None):
|
|
3411
|
+
set_approval_callback(cli_approval_with_live_pause)
|
|
3412
|
+
|
|
3363
3413
|
# Start agent in background thread
|
|
3364
3414
|
thread = threading.Thread(target=run_agent, daemon=True)
|
|
3365
3415
|
thread.start()
|
|
@@ -3367,9 +3417,26 @@ Now, {final_instruction.lower()}:"""
|
|
|
3367
3417
|
# Show live status while processing
|
|
3368
3418
|
try:
|
|
3369
3419
|
with Live(build_status_display(), console=console, refresh_per_second=4, transient=True) as live:
|
|
3420
|
+
status_info['live_instance'] = live
|
|
3370
3421
|
while not status_info['done']:
|
|
3422
|
+
# Check if approval is pending - stop Live to show prompt
|
|
3423
|
+
if status_info['approval_pending']:
|
|
3424
|
+
break
|
|
3371
3425
|
live.update(build_status_display())
|
|
3372
3426
|
time.sleep(0.1)
|
|
3427
|
+
|
|
3428
|
+
# If approval was pending, wait for it to complete then restart Live
|
|
3429
|
+
while status_info['approval_pending']:
|
|
3430
|
+
time.sleep(0.1)
|
|
3431
|
+
|
|
3432
|
+
# Continue with Live display if not done
|
|
3433
|
+
if not status_info['done']:
|
|
3434
|
+
with Live(build_status_display(), console=console, refresh_per_second=4, transient=True) as live:
|
|
3435
|
+
while not status_info['done']:
|
|
3436
|
+
if status_info['approval_pending']:
|
|
3437
|
+
break
|
|
3438
|
+
live.update(build_status_display())
|
|
3439
|
+
time.sleep(0.1)
|
|
3373
3440
|
except KeyboardInterrupt:
|
|
3374
3441
|
console.print("\n[dim]Interrupted[/dim]")
|
|
3375
3442
|
# Unregister callback
|
|
@@ -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.
|
|
60
|
+
file.write("RUN pip install flask praisonai==2.3.60 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
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.3.60"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.3.59"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|