praisonai-code 0.0.1__py3-none-any.whl
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_code/__init__.py +17 -0
- praisonai_code/cli/__init__.py +12 -0
- praisonai_code/cli/_forward_shim.py +10 -0
- praisonai_code/cli/_paths.py +88 -0
- praisonai_code/cli/_warnings.py +58 -0
- praisonai_code/cli/app.py +757 -0
- praisonai_code/cli/approval_backend.py +272 -0
- praisonai_code/cli/branding.py +94 -0
- praisonai_code/cli/commands/__init__.py +114 -0
- praisonai_code/cli/commands/acp.py +80 -0
- praisonai_code/cli/commands/agent.py +116 -0
- praisonai_code/cli/commands/agents.py +80 -0
- praisonai_code/cli/commands/app.py +139 -0
- praisonai_code/cli/commands/attach.py +95 -0
- praisonai_code/cli/commands/audit.py +102 -0
- praisonai_code/cli/commands/auth.py +508 -0
- praisonai_code/cli/commands/batch.py +848 -0
- praisonai_code/cli/commands/benchmark.py +286 -0
- praisonai_code/cli/commands/browser.py +299 -0
- praisonai_code/cli/commands/call.py +45 -0
- praisonai_code/cli/commands/chat.py +332 -0
- praisonai_code/cli/commands/checkpoint.py +170 -0
- praisonai_code/cli/commands/code.py +276 -0
- praisonai_code/cli/commands/command.py +114 -0
- praisonai_code/cli/commands/commit.py +47 -0
- praisonai_code/cli/commands/completion.py +333 -0
- praisonai_code/cli/commands/config.py +681 -0
- praisonai_code/cli/commands/context.py +414 -0
- praisonai_code/cli/commands/daemon.py +203 -0
- praisonai_code/cli/commands/debug.py +142 -0
- praisonai_code/cli/commands/deploy.py +71 -0
- praisonai_code/cli/commands/diag.py +55 -0
- praisonai_code/cli/commands/docs.py +1575 -0
- praisonai_code/cli/commands/doctor.py +332 -0
- praisonai_code/cli/commands/endpoints.py +51 -0
- praisonai_code/cli/commands/environment.py +179 -0
- praisonai_code/cli/commands/eval.py +131 -0
- praisonai_code/cli/commands/examples.py +953 -0
- praisonai_code/cli/commands/flow.py +436 -0
- praisonai_code/cli/commands/github.py +752 -0
- praisonai_code/cli/commands/hooks.py +74 -0
- praisonai_code/cli/commands/init.py +174 -0
- praisonai_code/cli/commands/knowledge.py +440 -0
- praisonai_code/cli/commands/langextract.py +120 -0
- praisonai_code/cli/commands/langfuse.py +984 -0
- praisonai_code/cli/commands/loop.py +211 -0
- praisonai_code/cli/commands/lsp.py +112 -0
- praisonai_code/cli/commands/managed.py +659 -0
- praisonai_code/cli/commands/mcp.py +763 -0
- praisonai_code/cli/commands/memory.py +298 -0
- praisonai_code/cli/commands/models.py +264 -0
- praisonai_code/cli/commands/n8n.py +326 -0
- praisonai_code/cli/commands/obs.py +19 -0
- praisonai_code/cli/commands/package.py +76 -0
- praisonai_code/cli/commands/paths.py +106 -0
- praisonai_code/cli/commands/permissions.py +272 -0
- praisonai_code/cli/commands/plugins.py +609 -0
- praisonai_code/cli/commands/port.py +530 -0
- praisonai_code/cli/commands/profile.py +466 -0
- praisonai_code/cli/commands/publish.py +193 -0
- praisonai_code/cli/commands/rag.py +913 -0
- praisonai_code/cli/commands/realtime.py +52 -0
- praisonai_code/cli/commands/recipe.py +684 -0
- praisonai_code/cli/commands/registry.py +59 -0
- praisonai_code/cli/commands/replay.py +830 -0
- praisonai_code/cli/commands/research.py +49 -0
- praisonai_code/cli/commands/retrieval.py +377 -0
- praisonai_code/cli/commands/rules.py +71 -0
- praisonai_code/cli/commands/run.py +1573 -0
- praisonai_code/cli/commands/sandbox.py +371 -0
- praisonai_code/cli/commands/schedule.py +529 -0
- praisonai_code/cli/commands/serve.py +690 -0
- praisonai_code/cli/commands/session.py +450 -0
- praisonai_code/cli/commands/setup.py +174 -0
- praisonai_code/cli/commands/skills.py +545 -0
- praisonai_code/cli/commands/standardise.py +711 -0
- praisonai_code/cli/commands/templates.py +54 -0
- praisonai_code/cli/commands/test.py +558 -0
- praisonai_code/cli/commands/todo.py +74 -0
- praisonai_code/cli/commands/tools.py +205 -0
- praisonai_code/cli/commands/traces.py +145 -0
- praisonai_code/cli/commands/tracker.py +852 -0
- praisonai_code/cli/commands/train.py +613 -0
- praisonai_code/cli/commands/ui.py +172 -0
- praisonai_code/cli/commands/up.py +354 -0
- praisonai_code/cli/commands/validate.py +291 -0
- praisonai_code/cli/commands/version.py +101 -0
- praisonai_code/cli/commands/workflow.py +97 -0
- praisonai_code/cli/config_loader.py +437 -0
- praisonai_code/cli/configuration/__init__.py +27 -0
- praisonai_code/cli/configuration/config.schema.json +57 -0
- praisonai_code/cli/configuration/credentials.py +446 -0
- praisonai_code/cli/configuration/loader.py +364 -0
- praisonai_code/cli/configuration/model_resolver.py +161 -0
- praisonai_code/cli/configuration/oauth.py +389 -0
- praisonai_code/cli/configuration/paths.py +224 -0
- praisonai_code/cli/configuration/resolver.py +687 -0
- praisonai_code/cli/configuration/schema.py +317 -0
- praisonai_code/cli/execution/__init__.py +99 -0
- praisonai_code/cli/execution/core.py +208 -0
- praisonai_code/cli/execution/profiler.py +898 -0
- praisonai_code/cli/execution/request.py +85 -0
- praisonai_code/cli/execution/result.py +74 -0
- praisonai_code/cli/fallback_schema.py +416 -0
- praisonai_code/cli/features/__init__.py +278 -0
- praisonai_code/cli/features/_endpoint_registry.py +64 -0
- praisonai_code/cli/features/_search_registry.py +43 -0
- praisonai_code/cli/features/acp.py +236 -0
- praisonai_code/cli/features/action_orchestrator.py +576 -0
- praisonai_code/cli/features/agent_scheduler.py +773 -0
- praisonai_code/cli/features/agent_tools.py +603 -0
- praisonai_code/cli/features/agents.py +397 -0
- praisonai_code/cli/features/at_mentions.py +471 -0
- praisonai_code/cli/features/audit_cli.py +270 -0
- praisonai_code/cli/features/auto_memory.py +182 -0
- praisonai_code/cli/features/auto_mode.py +552 -0
- praisonai_code/cli/features/autonomy_mode.py +546 -0
- praisonai_code/cli/features/background.py +356 -0
- praisonai_code/cli/features/base.py +168 -0
- praisonai_code/cli/features/benchmark.py +1462 -0
- praisonai_code/cli/features/capabilities.py +1326 -0
- praisonai_code/cli/features/checkpoints.py +345 -0
- praisonai_code/cli/features/cli_profiler.py +335 -0
- praisonai_code/cli/features/code_intelligence.py +666 -0
- praisonai_code/cli/features/compaction.py +294 -0
- praisonai_code/cli/features/compare.py +534 -0
- praisonai_code/cli/features/config_hierarchy.py +366 -0
- praisonai_code/cli/features/context_manager.py +597 -0
- praisonai_code/cli/features/cost_tracker.py +514 -0
- praisonai_code/cli/features/csv_test_runner.py +736 -0
- praisonai_code/cli/features/custom_definitions.py +790 -0
- praisonai_code/cli/features/debug.py +810 -0
- praisonai_code/cli/features/deploy.py +605 -0
- praisonai_code/cli/features/diag.py +289 -0
- praisonai_code/cli/features/display_jsonl.py +173 -0
- praisonai_code/cli/features/doctor/__init__.py +63 -0
- praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
- praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
- praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
- praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
- praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
- praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
- praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
- praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
- praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
- praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
- praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai_code/cli/features/doctor/engine.py +266 -0
- praisonai_code/cli/features/doctor/formatters.py +377 -0
- praisonai_code/cli/features/doctor/handler.py +564 -0
- praisonai_code/cli/features/doctor/models.py +276 -0
- praisonai_code/cli/features/doctor/registry.py +239 -0
- praisonai_code/cli/features/endpoints.py +1016 -0
- praisonai_code/cli/features/eval.py +559 -0
- praisonai_code/cli/features/examples.py +707 -0
- praisonai_code/cli/features/external_agents.py +231 -0
- praisonai_code/cli/features/fast_context.py +410 -0
- praisonai_code/cli/features/file_history.py +320 -0
- praisonai_code/cli/features/flow_display.py +566 -0
- praisonai_code/cli/features/git_attribution.py +159 -0
- praisonai_code/cli/features/git_integration.py +651 -0
- praisonai_code/cli/features/guardrail.py +171 -0
- praisonai_code/cli/features/handoff.py +252 -0
- praisonai_code/cli/features/hooks.py +583 -0
- praisonai_code/cli/features/hybrid_workflow.py +391 -0
- praisonai_code/cli/features/image.py +384 -0
- praisonai_code/cli/features/interactive_core_headless.py +450 -0
- praisonai_code/cli/features/interactive_runtime.py +600 -0
- praisonai_code/cli/features/interactive_test_harness.py +537 -0
- praisonai_code/cli/features/interactive_tools.py +428 -0
- praisonai_code/cli/features/interactive_tui.py +603 -0
- praisonai_code/cli/features/job_workflow.py +906 -0
- praisonai_code/cli/features/jobs.py +632 -0
- praisonai_code/cli/features/knowledge.py +531 -0
- praisonai_code/cli/features/knowledge_cli.py +438 -0
- praisonai_code/cli/features/lite.py +244 -0
- praisonai_code/cli/features/logs.py +200 -0
- praisonai_code/cli/features/lsp_cli.py +225 -0
- praisonai_code/cli/features/lsp_diagnostics.py +185 -0
- praisonai_code/cli/features/mcp.py +344 -0
- praisonai_code/cli/features/message_queue.py +587 -0
- praisonai_code/cli/features/metrics.py +210 -0
- praisonai_code/cli/features/migrate.py +1329 -0
- praisonai_code/cli/features/migration_flow.py +463 -0
- praisonai_code/cli/features/migration_spec.py +276 -0
- praisonai_code/cli/features/n8n.py +703 -0
- praisonai_code/cli/features/observability.py +293 -0
- praisonai_code/cli/features/ollama.py +361 -0
- praisonai_code/cli/features/output_modes.py +155 -0
- praisonai_code/cli/features/output_style.py +273 -0
- praisonai_code/cli/features/package.py +631 -0
- praisonai_code/cli/features/performance.py +308 -0
- praisonai_code/cli/features/persistence.py +636 -0
- praisonai_code/cli/features/profiler/__init__.py +81 -0
- praisonai_code/cli/features/profiler/core.py +558 -0
- praisonai_code/cli/features/profiler/optimizations.py +652 -0
- praisonai_code/cli/features/profiler/suite.py +386 -0
- praisonai_code/cli/features/queue/__init__.py +73 -0
- praisonai_code/cli/features/queue/manager.py +435 -0
- praisonai_code/cli/features/queue/models.py +289 -0
- praisonai_code/cli/features/queue/persistence.py +564 -0
- praisonai_code/cli/features/queue/scheduler.py +529 -0
- praisonai_code/cli/features/queue/worker.py +400 -0
- praisonai_code/cli/features/recipe.py +2187 -0
- praisonai_code/cli/features/recipe_creator.py +996 -0
- praisonai_code/cli/features/recipe_optimizer.py +1364 -0
- praisonai_code/cli/features/recipe_prompts.py +226 -0
- praisonai_code/cli/features/registry.py +229 -0
- praisonai_code/cli/features/repo_map.py +860 -0
- praisonai_code/cli/features/router.py +466 -0
- praisonai_code/cli/features/safe_shell.py +427 -0
- praisonai_code/cli/features/sandbox_cli.py +283 -0
- praisonai_code/cli/features/sandbox_executor.py +536 -0
- praisonai_code/cli/features/sdk_knowledge.py +500 -0
- praisonai_code/cli/features/session.py +222 -0
- praisonai_code/cli/features/session_checkpoints.py +208 -0
- praisonai_code/cli/features/setup/__init__.py +9 -0
- praisonai_code/cli/features/setup/handler.py +355 -0
- praisonai_code/cli/features/setup/templates.py +62 -0
- praisonai_code/cli/features/skills.py +940 -0
- praisonai_code/cli/features/slash_commands.py +692 -0
- praisonai_code/cli/features/telemetry.py +179 -0
- praisonai_code/cli/features/templates.py +1390 -0
- praisonai_code/cli/features/thinking.py +343 -0
- praisonai_code/cli/features/todo.py +334 -0
- praisonai_code/cli/features/tools.py +680 -0
- praisonai_code/cli/features/tui/__init__.py +83 -0
- praisonai_code/cli/features/tui/app.py +871 -0
- praisonai_code/cli/features/tui/cli.py +580 -0
- praisonai_code/cli/features/tui/config.py +150 -0
- praisonai_code/cli/features/tui/debug.py +526 -0
- praisonai_code/cli/features/tui/events.py +99 -0
- praisonai_code/cli/features/tui/mock_provider.py +328 -0
- praisonai_code/cli/features/tui/orchestrator.py +652 -0
- praisonai_code/cli/features/tui/screens/__init__.py +50 -0
- praisonai_code/cli/features/tui/screens/help.py +157 -0
- praisonai_code/cli/features/tui/screens/main.py +568 -0
- praisonai_code/cli/features/tui/screens/queue.py +174 -0
- praisonai_code/cli/features/tui/screens/session.py +124 -0
- praisonai_code/cli/features/tui/screens/settings.py +148 -0
- praisonai_code/cli/features/tui/session_store.py +198 -0
- praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
- praisonai_code/cli/features/tui/widgets/chat.py +263 -0
- praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
- praisonai_code/cli/features/tui/widgets/composer.py +292 -0
- praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
- praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
- praisonai_code/cli/features/tui/widgets/status.py +181 -0
- praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
- praisonai_code/cli/features/wizard.py +289 -0
- praisonai_code/cli/features/workflow.py +802 -0
- praisonai_code/cli/features/yaml_utils.py +321 -0
- praisonai_code/cli/interactive/__init__.py +48 -0
- praisonai_code/cli/interactive/async_tui.py +1218 -0
- praisonai_code/cli/interactive/config.py +139 -0
- praisonai_code/cli/interactive/core.py +618 -0
- praisonai_code/cli/interactive/events.py +131 -0
- praisonai_code/cli/interactive/frontends/__init__.py +31 -0
- praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
- praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
- praisonai_code/cli/interactive/praison_io.py +502 -0
- praisonai_code/cli/interactive/repl.py +297 -0
- praisonai_code/cli/interactive/split_tui.py +456 -0
- praisonai_code/cli/interactive/tui_app.py +457 -0
- praisonai_code/cli/langfuse_client.py +360 -0
- praisonai_code/cli/main.py +7421 -0
- praisonai_code/cli/output/__init__.py +25 -0
- praisonai_code/cli/output/console.py +456 -0
- praisonai_code/cli/output/event_bridge.py +191 -0
- praisonai_code/cli/schedule_cli.py +54 -0
- praisonai_code/cli/schema_provider.py +23 -0
- praisonai_code/cli/session/__init__.py +16 -0
- praisonai_code/cli/session/resume.py +148 -0
- praisonai_code/cli/session/unified.py +548 -0
- praisonai_code/cli/state/__init__.py +31 -0
- praisonai_code/cli/state/identifiers.py +161 -0
- praisonai_code/cli/state/project_sessions.py +383 -0
- praisonai_code/cli/state/sessions.py +390 -0
- praisonai_code/cli/ui/__init__.py +160 -0
- praisonai_code/cli/ui/config.py +46 -0
- praisonai_code/cli/ui/events.py +61 -0
- praisonai_code/cli/ui/mg_backend.py +342 -0
- praisonai_code/cli/ui/plain.py +133 -0
- praisonai_code/cli/ui/rich_backend.py +162 -0
- praisonai_code/cli/unified_schema.py +655 -0
- praisonai_code/cli/utils/env_utils.py +126 -0
- praisonai_code/cli/utils/project.py +131 -0
- praisonai_code/cli_backends/__init__.py +73 -0
- praisonai_code/cli_backends/claude.py +373 -0
- praisonai_code/cli_backends/registry.py +113 -0
- praisonai_code/runtime/__init__.py +36 -0
- praisonai_code/runtime/__main__.py +81 -0
- praisonai_code/runtime/client.py +131 -0
- praisonai_code/runtime/descriptor.py +209 -0
- praisonai_code/runtime/server.py +356 -0
- praisonai_code-0.0.1.dist-info/METADATA +80 -0
- praisonai_code-0.0.1.dist-info/RECORD +309 -0
- praisonai_code-0.0.1.dist-info/WHEEL +5 -0
- praisonai_code-0.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Benchmark command group for PraisonAI CLI.
|
|
3
|
+
|
|
4
|
+
Provides comprehensive performance benchmarking across all execution paths.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
import typer
|
|
10
|
+
|
|
11
|
+
app = typer.Typer(help="Comprehensive performance benchmarking")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@app.command("profile")
|
|
15
|
+
def benchmark_profile(
|
|
16
|
+
prompt: str = typer.Argument("Hi", help="Prompt to benchmark"),
|
|
17
|
+
iterations: int = typer.Option(3, "--iterations", "-n", help="Number of iterations per path"),
|
|
18
|
+
output_format: str = typer.Option("text", "--format", "-f", help="Output format: text or json"),
|
|
19
|
+
output_file: Optional[str] = typer.Option(None, "--output", "-o", help="Save results to file"),
|
|
20
|
+
deep: bool = typer.Option(False, "--deep", help="Enable deep cProfile profiling (per-function timing, call graphs)"),
|
|
21
|
+
limit: int = typer.Option(30, "--limit", "-l", help="Top N functions to show in deep profile"),
|
|
22
|
+
):
|
|
23
|
+
"""
|
|
24
|
+
Run full benchmark suite across all execution paths.
|
|
25
|
+
|
|
26
|
+
Benchmarks:
|
|
27
|
+
- OpenAI SDK (baseline)
|
|
28
|
+
- PraisonAI Agent
|
|
29
|
+
- PraisonAI CLI
|
|
30
|
+
- PraisonAI CLI with profiling
|
|
31
|
+
- PraisonAI Workflow (single agent)
|
|
32
|
+
- PraisonAI Workflow (multi-agent)
|
|
33
|
+
- PraisonAI via LiteLLM
|
|
34
|
+
- LiteLLM standalone
|
|
35
|
+
|
|
36
|
+
With --deep flag, includes:
|
|
37
|
+
- Per-function timing (cProfile stats)
|
|
38
|
+
- Self time vs cumulative time
|
|
39
|
+
- Call counts per function
|
|
40
|
+
- Caller/callee relationships
|
|
41
|
+
- Module breakdown by category
|
|
42
|
+
- Call graph data
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
praisonai benchmark profile "What is 2+2?"
|
|
46
|
+
praisonai benchmark profile "Hi" --iterations 5
|
|
47
|
+
praisonai benchmark profile "Hi" --deep --limit 50
|
|
48
|
+
praisonai benchmark profile "Hi" --deep --format json --output results.json
|
|
49
|
+
"""
|
|
50
|
+
try:
|
|
51
|
+
from praisonai.cli.features.benchmark import BenchmarkHandler
|
|
52
|
+
except ImportError as e:
|
|
53
|
+
typer.echo(f"Error: Benchmark module not available: {e}", err=True)
|
|
54
|
+
raise typer.Exit(1)
|
|
55
|
+
|
|
56
|
+
if deep:
|
|
57
|
+
typer.echo("⚠️ Deep profiling enabled - this adds overhead to measurements", err=True)
|
|
58
|
+
|
|
59
|
+
handler = BenchmarkHandler()
|
|
60
|
+
report = handler.run_full_benchmark(
|
|
61
|
+
prompt=prompt,
|
|
62
|
+
iterations=iterations,
|
|
63
|
+
verbose=True,
|
|
64
|
+
deep=deep,
|
|
65
|
+
limit=limit
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
if output_format == "json":
|
|
69
|
+
import json
|
|
70
|
+
output = json.dumps(report.to_dict(), indent=2)
|
|
71
|
+
if output_file:
|
|
72
|
+
with open(output_file, "w") as f:
|
|
73
|
+
f.write(output)
|
|
74
|
+
typer.echo(f"Results saved to {output_file}")
|
|
75
|
+
else:
|
|
76
|
+
typer.echo(output)
|
|
77
|
+
else:
|
|
78
|
+
handler.print_report(report, deep=deep, limit=limit)
|
|
79
|
+
if output_file:
|
|
80
|
+
import json
|
|
81
|
+
with open(output_file, "w") as f:
|
|
82
|
+
f.write(json.dumps(report.to_dict(), indent=2))
|
|
83
|
+
typer.echo(f"\nJSON results saved to {output_file}")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@app.command("compare")
|
|
87
|
+
def benchmark_compare(
|
|
88
|
+
prompt: str = typer.Argument("Hi", help="Prompt to benchmark"),
|
|
89
|
+
iterations: int = typer.Option(2, "--iterations", "-n", help="Number of iterations"),
|
|
90
|
+
):
|
|
91
|
+
"""
|
|
92
|
+
Quick comparison of key execution paths.
|
|
93
|
+
|
|
94
|
+
Compares OpenAI SDK, PraisonAI Agent, PraisonAI CLI, and LiteLLM.
|
|
95
|
+
|
|
96
|
+
Examples:
|
|
97
|
+
praisonai benchmark compare "Hi"
|
|
98
|
+
praisonai benchmark compare "What is 2+2?" --iterations 3
|
|
99
|
+
"""
|
|
100
|
+
try:
|
|
101
|
+
from praisonai.cli.features.benchmark import BenchmarkHandler
|
|
102
|
+
except ImportError as e:
|
|
103
|
+
typer.echo(f"Error: Benchmark module not available: {e}", err=True)
|
|
104
|
+
raise typer.Exit(1)
|
|
105
|
+
|
|
106
|
+
handler = BenchmarkHandler()
|
|
107
|
+
report = handler.run_full_benchmark(
|
|
108
|
+
prompt=prompt,
|
|
109
|
+
iterations=iterations,
|
|
110
|
+
paths=["openai_sdk", "praisonai_agent", "praisonai_cli", "litellm_standalone"],
|
|
111
|
+
verbose=True
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
typer.echo("\n" + handler.create_comparison_table(report))
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@app.command("sdk")
|
|
118
|
+
def benchmark_sdk(
|
|
119
|
+
prompt: str = typer.Argument("Hi", help="Prompt to benchmark"),
|
|
120
|
+
iterations: int = typer.Option(3, "--iterations", "-n", help="Number of iterations"),
|
|
121
|
+
output_format: str = typer.Option("text", "--format", "-f", help="Output format: text or json"),
|
|
122
|
+
):
|
|
123
|
+
"""
|
|
124
|
+
Benchmark OpenAI SDK only (baseline).
|
|
125
|
+
|
|
126
|
+
Examples:
|
|
127
|
+
praisonai benchmark sdk "Hi"
|
|
128
|
+
praisonai benchmark sdk "What is 2+2?" --iterations 5
|
|
129
|
+
"""
|
|
130
|
+
try:
|
|
131
|
+
from praisonai.cli.features.benchmark import BenchmarkHandler
|
|
132
|
+
except ImportError as e:
|
|
133
|
+
typer.echo(f"Error: Benchmark module not available: {e}", err=True)
|
|
134
|
+
raise typer.Exit(1)
|
|
135
|
+
|
|
136
|
+
handler = BenchmarkHandler()
|
|
137
|
+
report = handler.run_full_benchmark(prompt=prompt, iterations=iterations, paths=["openai_sdk"], verbose=True)
|
|
138
|
+
|
|
139
|
+
if output_format == "json":
|
|
140
|
+
import json
|
|
141
|
+
typer.echo(json.dumps(report.to_dict(), indent=2))
|
|
142
|
+
else:
|
|
143
|
+
handler.print_report(report)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@app.command("agent")
|
|
147
|
+
def benchmark_agent(
|
|
148
|
+
prompt: str = typer.Argument("Hi", help="Prompt to benchmark"),
|
|
149
|
+
iterations: int = typer.Option(3, "--iterations", "-n", help="Number of iterations"),
|
|
150
|
+
output_format: str = typer.Option("text", "--format", "-f", help="Output format: text or json"),
|
|
151
|
+
):
|
|
152
|
+
"""
|
|
153
|
+
Benchmark PraisonAI Agent vs SDK baseline.
|
|
154
|
+
|
|
155
|
+
Examples:
|
|
156
|
+
praisonai benchmark agent "Hi"
|
|
157
|
+
praisonai benchmark agent "What is 2+2?" --iterations 5
|
|
158
|
+
"""
|
|
159
|
+
try:
|
|
160
|
+
from praisonai.cli.features.benchmark import BenchmarkHandler
|
|
161
|
+
except ImportError as e:
|
|
162
|
+
typer.echo(f"Error: Benchmark module not available: {e}", err=True)
|
|
163
|
+
raise typer.Exit(1)
|
|
164
|
+
|
|
165
|
+
handler = BenchmarkHandler()
|
|
166
|
+
report = handler.run_full_benchmark(
|
|
167
|
+
prompt=prompt,
|
|
168
|
+
iterations=iterations,
|
|
169
|
+
paths=["openai_sdk", "praisonai_agent"],
|
|
170
|
+
verbose=True
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
if output_format == "json":
|
|
174
|
+
import json
|
|
175
|
+
typer.echo(json.dumps(report.to_dict(), indent=2))
|
|
176
|
+
else:
|
|
177
|
+
handler.print_report(report)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
@app.command("cli")
|
|
181
|
+
def benchmark_cli(
|
|
182
|
+
prompt: str = typer.Argument("Hi", help="Prompt to benchmark"),
|
|
183
|
+
iterations: int = typer.Option(3, "--iterations", "-n", help="Number of iterations"),
|
|
184
|
+
output_format: str = typer.Option("text", "--format", "-f", help="Output format: text or json"),
|
|
185
|
+
):
|
|
186
|
+
"""
|
|
187
|
+
Benchmark PraisonAI CLI vs SDK baseline.
|
|
188
|
+
|
|
189
|
+
Examples:
|
|
190
|
+
praisonai benchmark cli "Hi"
|
|
191
|
+
praisonai benchmark cli "What is 2+2?" --iterations 5
|
|
192
|
+
"""
|
|
193
|
+
try:
|
|
194
|
+
from praisonai.cli.features.benchmark import BenchmarkHandler
|
|
195
|
+
except ImportError as e:
|
|
196
|
+
typer.echo(f"Error: Benchmark module not available: {e}", err=True)
|
|
197
|
+
raise typer.Exit(1)
|
|
198
|
+
|
|
199
|
+
handler = BenchmarkHandler()
|
|
200
|
+
report = handler.run_full_benchmark(
|
|
201
|
+
prompt=prompt,
|
|
202
|
+
iterations=iterations,
|
|
203
|
+
paths=["openai_sdk", "praisonai_cli", "praisonai_cli_profile"],
|
|
204
|
+
verbose=True
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
if output_format == "json":
|
|
208
|
+
import json
|
|
209
|
+
typer.echo(json.dumps(report.to_dict(), indent=2))
|
|
210
|
+
else:
|
|
211
|
+
handler.print_report(report)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
@app.command("workflow")
|
|
215
|
+
def benchmark_workflow(
|
|
216
|
+
prompt: str = typer.Argument("Hi", help="Prompt to benchmark"),
|
|
217
|
+
iterations: int = typer.Option(3, "--iterations", "-n", help="Number of iterations"),
|
|
218
|
+
output_format: str = typer.Option("text", "--format", "-f", help="Output format: text or json"),
|
|
219
|
+
):
|
|
220
|
+
"""
|
|
221
|
+
Benchmark PraisonAI Workflow (single and multi-agent) vs SDK baseline.
|
|
222
|
+
|
|
223
|
+
Examples:
|
|
224
|
+
praisonai benchmark workflow "Hi"
|
|
225
|
+
praisonai benchmark workflow "What is 2+2?" --iterations 5
|
|
226
|
+
"""
|
|
227
|
+
try:
|
|
228
|
+
from praisonai.cli.features.benchmark import BenchmarkHandler
|
|
229
|
+
except ImportError as e:
|
|
230
|
+
typer.echo(f"Error: Benchmark module not available: {e}", err=True)
|
|
231
|
+
raise typer.Exit(1)
|
|
232
|
+
|
|
233
|
+
handler = BenchmarkHandler()
|
|
234
|
+
report = handler.run_full_benchmark(
|
|
235
|
+
prompt=prompt,
|
|
236
|
+
iterations=iterations,
|
|
237
|
+
paths=["openai_sdk", "praisonai_workflow_single", "praisonai_workflow_multi"],
|
|
238
|
+
verbose=True
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
if output_format == "json":
|
|
242
|
+
import json
|
|
243
|
+
typer.echo(json.dumps(report.to_dict(), indent=2))
|
|
244
|
+
else:
|
|
245
|
+
handler.print_report(report)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
@app.command("litellm")
|
|
249
|
+
def benchmark_litellm(
|
|
250
|
+
prompt: str = typer.Argument("Hi", help="Prompt to benchmark"),
|
|
251
|
+
iterations: int = typer.Option(3, "--iterations", "-n", help="Number of iterations"),
|
|
252
|
+
output_format: str = typer.Option("text", "--format", "-f", help="Output format: text or json"),
|
|
253
|
+
):
|
|
254
|
+
"""
|
|
255
|
+
Benchmark LiteLLM paths vs SDK baseline.
|
|
256
|
+
|
|
257
|
+
Examples:
|
|
258
|
+
praisonai benchmark litellm "Hi"
|
|
259
|
+
praisonai benchmark litellm "What is 2+2?" --iterations 5
|
|
260
|
+
"""
|
|
261
|
+
try:
|
|
262
|
+
from praisonai.cli.features.benchmark import BenchmarkHandler
|
|
263
|
+
except ImportError as e:
|
|
264
|
+
typer.echo(f"Error: Benchmark module not available: {e}", err=True)
|
|
265
|
+
raise typer.Exit(1)
|
|
266
|
+
|
|
267
|
+
handler = BenchmarkHandler()
|
|
268
|
+
report = handler.run_full_benchmark(
|
|
269
|
+
prompt=prompt,
|
|
270
|
+
iterations=iterations,
|
|
271
|
+
paths=["openai_sdk", "praisonai_litellm", "litellm_standalone"],
|
|
272
|
+
verbose=True
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
if output_format == "json":
|
|
276
|
+
import json
|
|
277
|
+
typer.echo(json.dumps(report.to_dict(), indent=2))
|
|
278
|
+
else:
|
|
279
|
+
handler.print_report(report)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
@app.callback(invoke_without_command=True)
|
|
283
|
+
def benchmark_callback(ctx: typer.Context):
|
|
284
|
+
"""Show benchmark help if no subcommand."""
|
|
285
|
+
if ctx.invoked_subcommand is None:
|
|
286
|
+
typer.echo(ctx.get_help())
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Browser command group for PraisonAI CLI.
|
|
3
|
+
|
|
4
|
+
Provides browser control commands for agent automation.
|
|
5
|
+
Inspired by moltbot's browser CLI.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
import typer
|
|
11
|
+
|
|
12
|
+
app = typer.Typer(
|
|
13
|
+
help="Browser control for agent automation",
|
|
14
|
+
no_args_is_help=True,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command("status")
|
|
19
|
+
def browser_status(
|
|
20
|
+
profile: str = typer.Option("default", "--profile", "-p", help="Browser profile name"),
|
|
21
|
+
json_output: bool = typer.Option(False, "--json", help="Output JSON"),
|
|
22
|
+
):
|
|
23
|
+
"""Check browser status.
|
|
24
|
+
|
|
25
|
+
Examples:
|
|
26
|
+
praisonai browser status
|
|
27
|
+
praisonai browser --profile chrome status
|
|
28
|
+
"""
|
|
29
|
+
try:
|
|
30
|
+
from rich.console import Console
|
|
31
|
+
console = Console()
|
|
32
|
+
|
|
33
|
+
# Check if browser tools are available
|
|
34
|
+
try:
|
|
35
|
+
from praisonai_tools import BrowserBaseTool
|
|
36
|
+
console.print(f"[green]✓[/green] Browser tools available")
|
|
37
|
+
console.print(f" Profile: {profile}")
|
|
38
|
+
console.print(f" Status: Ready")
|
|
39
|
+
except ImportError:
|
|
40
|
+
console.print("[yellow]![/yellow] Browser tools not installed")
|
|
41
|
+
console.print(" Install with: pip install praisonai-tools")
|
|
42
|
+
|
|
43
|
+
except ImportError:
|
|
44
|
+
print(f"Browser status: Profile={profile}")
|
|
45
|
+
print("Install rich for better output: pip install rich")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@app.command("open")
|
|
49
|
+
def browser_open(
|
|
50
|
+
url: str = typer.Argument(..., help="URL to open"),
|
|
51
|
+
profile: str = typer.Option("default", "--profile", "-p", help="Browser profile name"),
|
|
52
|
+
headless: bool = typer.Option(False, "--headless", help="Run in headless mode"),
|
|
53
|
+
):
|
|
54
|
+
"""Open a URL in the browser.
|
|
55
|
+
|
|
56
|
+
Examples:
|
|
57
|
+
praisonai browser open https://example.com
|
|
58
|
+
praisonai browser open https://example.com --headless
|
|
59
|
+
"""
|
|
60
|
+
try:
|
|
61
|
+
from praisonai_tools import BrowserBaseTool
|
|
62
|
+
|
|
63
|
+
print(f"Opening {url} in browser (profile: {profile})...")
|
|
64
|
+
browser = BrowserBaseTool()
|
|
65
|
+
result = browser.run(action="navigate", url=url)
|
|
66
|
+
print(f"Result: {result}")
|
|
67
|
+
|
|
68
|
+
except ImportError:
|
|
69
|
+
print("Error: Browser tools not installed")
|
|
70
|
+
print("Install with: pip install praisonai-tools")
|
|
71
|
+
raise typer.Exit(1)
|
|
72
|
+
except Exception as e:
|
|
73
|
+
print(f"Error: {e}")
|
|
74
|
+
raise typer.Exit(1)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@app.command("snapshot")
|
|
78
|
+
def browser_snapshot(
|
|
79
|
+
profile: str = typer.Option("default", "--profile", "-p", help="Browser profile name"),
|
|
80
|
+
output: Optional[str] = typer.Option(None, "--output", "-o", help="Output file path"),
|
|
81
|
+
format: str = typer.Option("aria", "--format", "-f", help="Snapshot format (aria, ai)"),
|
|
82
|
+
):
|
|
83
|
+
"""Take a snapshot of the current page.
|
|
84
|
+
|
|
85
|
+
Examples:
|
|
86
|
+
praisonai browser snapshot
|
|
87
|
+
praisonai browser snapshot --output snapshot.txt
|
|
88
|
+
"""
|
|
89
|
+
try:
|
|
90
|
+
from praisonai_tools import BrowserBaseTool
|
|
91
|
+
|
|
92
|
+
print(f"Taking snapshot (profile: {profile})...")
|
|
93
|
+
browser = BrowserBaseTool()
|
|
94
|
+
result = browser.run(action="snapshot")
|
|
95
|
+
|
|
96
|
+
if output:
|
|
97
|
+
with open(output, "w") as f:
|
|
98
|
+
f.write(str(result))
|
|
99
|
+
print(f"Snapshot saved to: {output}")
|
|
100
|
+
else:
|
|
101
|
+
print(result)
|
|
102
|
+
|
|
103
|
+
except ImportError:
|
|
104
|
+
print("Error: Browser tools not installed")
|
|
105
|
+
print("Install with: pip install praisonai-tools")
|
|
106
|
+
raise typer.Exit(1)
|
|
107
|
+
except Exception as e:
|
|
108
|
+
print(f"Error: {e}")
|
|
109
|
+
raise typer.Exit(1)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@app.command("screenshot")
|
|
113
|
+
def browser_screenshot(
|
|
114
|
+
profile: str = typer.Option("default", "--profile", "-p", help="Browser profile name"),
|
|
115
|
+
output: Optional[str] = typer.Option(None, "--output", "-o", help="Output file path"),
|
|
116
|
+
full_page: bool = typer.Option(False, "--full-page", help="Capture full page"),
|
|
117
|
+
format: str = typer.Option("png", "--format", "-f", help="Image format (png, jpeg)"),
|
|
118
|
+
):
|
|
119
|
+
"""Take a screenshot of the current page.
|
|
120
|
+
|
|
121
|
+
Examples:
|
|
122
|
+
praisonai browser screenshot
|
|
123
|
+
praisonai browser screenshot --output page.png --full-page
|
|
124
|
+
"""
|
|
125
|
+
try:
|
|
126
|
+
from praisonai_tools import BrowserBaseTool
|
|
127
|
+
|
|
128
|
+
print(f"Taking screenshot (profile: {profile})...")
|
|
129
|
+
browser = BrowserBaseTool()
|
|
130
|
+
result = browser.run(action="screenshot", full_page=full_page)
|
|
131
|
+
|
|
132
|
+
if output:
|
|
133
|
+
# Save screenshot to file
|
|
134
|
+
print(f"Screenshot saved to: {output}")
|
|
135
|
+
else:
|
|
136
|
+
print(f"Screenshot captured: {result}")
|
|
137
|
+
|
|
138
|
+
except ImportError:
|
|
139
|
+
print("Error: Browser tools not installed")
|
|
140
|
+
print("Install with: pip install praisonai-tools")
|
|
141
|
+
raise typer.Exit(1)
|
|
142
|
+
except Exception as e:
|
|
143
|
+
print(f"Error: {e}")
|
|
144
|
+
raise typer.Exit(1)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@app.command("click")
|
|
148
|
+
def browser_click(
|
|
149
|
+
selector: str = typer.Argument(..., help="Element selector or ref"),
|
|
150
|
+
profile: str = typer.Option("default", "--profile", "-p", help="Browser profile name"),
|
|
151
|
+
double: bool = typer.Option(False, "--double", help="Double click"),
|
|
152
|
+
):
|
|
153
|
+
"""Click an element on the page.
|
|
154
|
+
|
|
155
|
+
Examples:
|
|
156
|
+
praisonai browser click "#submit-button"
|
|
157
|
+
praisonai browser click "ref:123" --double
|
|
158
|
+
"""
|
|
159
|
+
try:
|
|
160
|
+
from praisonai_tools import BrowserBaseTool
|
|
161
|
+
|
|
162
|
+
print(f"Clicking element: {selector}")
|
|
163
|
+
browser = BrowserBaseTool()
|
|
164
|
+
result = browser.run(action="click", selector=selector)
|
|
165
|
+
print(f"Result: {result}")
|
|
166
|
+
|
|
167
|
+
except ImportError:
|
|
168
|
+
print("Error: Browser tools not installed")
|
|
169
|
+
raise typer.Exit(1)
|
|
170
|
+
except Exception as e:
|
|
171
|
+
print(f"Error: {e}")
|
|
172
|
+
raise typer.Exit(1)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
@app.command("type")
|
|
176
|
+
def browser_type(
|
|
177
|
+
selector: str = typer.Argument(..., help="Element selector or ref"),
|
|
178
|
+
text: str = typer.Argument(..., help="Text to type"),
|
|
179
|
+
profile: str = typer.Option("default", "--profile", "-p", help="Browser profile name"),
|
|
180
|
+
submit: bool = typer.Option(False, "--submit", help="Submit after typing"),
|
|
181
|
+
):
|
|
182
|
+
"""Type text into an element.
|
|
183
|
+
|
|
184
|
+
Examples:
|
|
185
|
+
praisonai browser type "#search-input" "hello world"
|
|
186
|
+
praisonai browser type "#search-input" "hello world" --submit
|
|
187
|
+
"""
|
|
188
|
+
try:
|
|
189
|
+
from praisonai_tools import BrowserBaseTool
|
|
190
|
+
|
|
191
|
+
print(f"Typing into element: {selector}")
|
|
192
|
+
browser = BrowserBaseTool()
|
|
193
|
+
result = browser.run(action="type", selector=selector, text=text)
|
|
194
|
+
print(f"Result: {result}")
|
|
195
|
+
|
|
196
|
+
except ImportError:
|
|
197
|
+
print("Error: Browser tools not installed")
|
|
198
|
+
raise typer.Exit(1)
|
|
199
|
+
except Exception as e:
|
|
200
|
+
print(f"Error: {e}")
|
|
201
|
+
raise typer.Exit(1)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@app.command("navigate")
|
|
205
|
+
def browser_navigate(
|
|
206
|
+
url: str = typer.Argument(..., help="URL to navigate to"),
|
|
207
|
+
profile: str = typer.Option("default", "--profile", "-p", help="Browser profile name"),
|
|
208
|
+
):
|
|
209
|
+
"""Navigate to a URL.
|
|
210
|
+
|
|
211
|
+
Examples:
|
|
212
|
+
praisonai browser navigate https://example.com
|
|
213
|
+
"""
|
|
214
|
+
try:
|
|
215
|
+
from praisonai_tools import BrowserBaseTool
|
|
216
|
+
|
|
217
|
+
print(f"Navigating to: {url}")
|
|
218
|
+
browser = BrowserBaseTool()
|
|
219
|
+
result = browser.run(action="navigate", url=url)
|
|
220
|
+
print(f"Result: {result}")
|
|
221
|
+
|
|
222
|
+
except ImportError:
|
|
223
|
+
print("Error: Browser tools not installed")
|
|
224
|
+
raise typer.Exit(1)
|
|
225
|
+
except Exception as e:
|
|
226
|
+
print(f"Error: {e}")
|
|
227
|
+
raise typer.Exit(1)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
@app.command("profiles")
|
|
231
|
+
def browser_profiles(
|
|
232
|
+
json_output: bool = typer.Option(False, "--json", help="Output JSON"),
|
|
233
|
+
):
|
|
234
|
+
"""List available browser profiles.
|
|
235
|
+
|
|
236
|
+
Examples:
|
|
237
|
+
praisonai browser profiles
|
|
238
|
+
praisonai browser profiles --json
|
|
239
|
+
"""
|
|
240
|
+
profiles = [
|
|
241
|
+
{"name": "default", "description": "Default browser profile"},
|
|
242
|
+
{"name": "chrome", "description": "Chrome browser via extension relay"},
|
|
243
|
+
{"name": "headless", "description": "Headless browser for automation"},
|
|
244
|
+
]
|
|
245
|
+
|
|
246
|
+
if json_output:
|
|
247
|
+
import json
|
|
248
|
+
print(json.dumps(profiles, indent=2))
|
|
249
|
+
else:
|
|
250
|
+
try:
|
|
251
|
+
from rich.console import Console
|
|
252
|
+
from rich.table import Table
|
|
253
|
+
|
|
254
|
+
console = Console()
|
|
255
|
+
table = Table(title="Browser Profiles")
|
|
256
|
+
table.add_column("Name", style="cyan")
|
|
257
|
+
table.add_column("Description")
|
|
258
|
+
|
|
259
|
+
for p in profiles:
|
|
260
|
+
table.add_row(p["name"], p["description"])
|
|
261
|
+
|
|
262
|
+
console.print(table)
|
|
263
|
+
except ImportError:
|
|
264
|
+
for p in profiles:
|
|
265
|
+
print(f" {p['name']}: {p['description']}")
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
@app.callback(invoke_without_command=True)
|
|
269
|
+
def browser_callback(ctx: typer.Context):
|
|
270
|
+
"""Show browser help if no subcommand provided."""
|
|
271
|
+
if ctx.invoked_subcommand is None:
|
|
272
|
+
help_text = """
|
|
273
|
+
[bold cyan]PraisonAI Browser - Browser Control for Agent Automation[/bold cyan]
|
|
274
|
+
|
|
275
|
+
Control browsers for agent automation with: praisonai browser <command>
|
|
276
|
+
|
|
277
|
+
[bold]Commands:[/bold]
|
|
278
|
+
[green]status[/green] Check browser status
|
|
279
|
+
[green]open[/green] Open a URL
|
|
280
|
+
[green]navigate[/green] Navigate to a URL
|
|
281
|
+
[green]snapshot[/green] Take a page snapshot
|
|
282
|
+
[green]screenshot[/green] Take a screenshot
|
|
283
|
+
[green]click[/green] Click an element
|
|
284
|
+
[green]type[/green] Type text into an element
|
|
285
|
+
[green]profiles[/green] List browser profiles
|
|
286
|
+
|
|
287
|
+
[bold]Examples:[/bold]
|
|
288
|
+
praisonai browser status
|
|
289
|
+
praisonai browser open https://example.com
|
|
290
|
+
praisonai browser snapshot --output page.txt
|
|
291
|
+
praisonai browser click "#submit-button"
|
|
292
|
+
"""
|
|
293
|
+
try:
|
|
294
|
+
from rich import print as rprint
|
|
295
|
+
rprint(help_text)
|
|
296
|
+
except ImportError:
|
|
297
|
+
import re
|
|
298
|
+
plain = re.sub(r'\[/?[^\]]+\]', '', help_text)
|
|
299
|
+
print(plain)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Call command group for PraisonAI CLI.
|
|
3
|
+
|
|
4
|
+
Provides voice/call interaction commands.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
import typer
|
|
10
|
+
|
|
11
|
+
app = typer.Typer(help="Voice/call interaction mode")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@app.callback(invoke_without_command=True)
|
|
15
|
+
def call_main(
|
|
16
|
+
ctx: typer.Context,
|
|
17
|
+
model: Optional[str] = typer.Option(None, "--model", "-m", help="LLM model to use"),
|
|
18
|
+
verbose: bool = typer.Option(False, "--verbose", "-v", help="Verbose output"),
|
|
19
|
+
):
|
|
20
|
+
"""
|
|
21
|
+
Start voice/call interaction mode.
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
praisonai call
|
|
25
|
+
praisonai call --model gpt-4o
|
|
26
|
+
"""
|
|
27
|
+
from praisonai.cli.main import PraisonAI
|
|
28
|
+
import sys
|
|
29
|
+
|
|
30
|
+
argv = ['call']
|
|
31
|
+
if model:
|
|
32
|
+
argv.extend(['--model', model])
|
|
33
|
+
if verbose:
|
|
34
|
+
argv.append('--verbose')
|
|
35
|
+
|
|
36
|
+
original_argv = sys.argv
|
|
37
|
+
sys.argv = ['praisonai'] + argv
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
praison = PraisonAI()
|
|
41
|
+
praison.main()
|
|
42
|
+
except SystemExit:
|
|
43
|
+
pass
|
|
44
|
+
finally:
|
|
45
|
+
sys.argv = original_argv
|