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.
Files changed (309) hide show
  1. praisonai_code/__init__.py +17 -0
  2. praisonai_code/cli/__init__.py +12 -0
  3. praisonai_code/cli/_forward_shim.py +10 -0
  4. praisonai_code/cli/_paths.py +88 -0
  5. praisonai_code/cli/_warnings.py +58 -0
  6. praisonai_code/cli/app.py +757 -0
  7. praisonai_code/cli/approval_backend.py +272 -0
  8. praisonai_code/cli/branding.py +94 -0
  9. praisonai_code/cli/commands/__init__.py +114 -0
  10. praisonai_code/cli/commands/acp.py +80 -0
  11. praisonai_code/cli/commands/agent.py +116 -0
  12. praisonai_code/cli/commands/agents.py +80 -0
  13. praisonai_code/cli/commands/app.py +139 -0
  14. praisonai_code/cli/commands/attach.py +95 -0
  15. praisonai_code/cli/commands/audit.py +102 -0
  16. praisonai_code/cli/commands/auth.py +508 -0
  17. praisonai_code/cli/commands/batch.py +848 -0
  18. praisonai_code/cli/commands/benchmark.py +286 -0
  19. praisonai_code/cli/commands/browser.py +299 -0
  20. praisonai_code/cli/commands/call.py +45 -0
  21. praisonai_code/cli/commands/chat.py +332 -0
  22. praisonai_code/cli/commands/checkpoint.py +170 -0
  23. praisonai_code/cli/commands/code.py +276 -0
  24. praisonai_code/cli/commands/command.py +114 -0
  25. praisonai_code/cli/commands/commit.py +47 -0
  26. praisonai_code/cli/commands/completion.py +333 -0
  27. praisonai_code/cli/commands/config.py +681 -0
  28. praisonai_code/cli/commands/context.py +414 -0
  29. praisonai_code/cli/commands/daemon.py +203 -0
  30. praisonai_code/cli/commands/debug.py +142 -0
  31. praisonai_code/cli/commands/deploy.py +71 -0
  32. praisonai_code/cli/commands/diag.py +55 -0
  33. praisonai_code/cli/commands/docs.py +1575 -0
  34. praisonai_code/cli/commands/doctor.py +332 -0
  35. praisonai_code/cli/commands/endpoints.py +51 -0
  36. praisonai_code/cli/commands/environment.py +179 -0
  37. praisonai_code/cli/commands/eval.py +131 -0
  38. praisonai_code/cli/commands/examples.py +953 -0
  39. praisonai_code/cli/commands/flow.py +436 -0
  40. praisonai_code/cli/commands/github.py +752 -0
  41. praisonai_code/cli/commands/hooks.py +74 -0
  42. praisonai_code/cli/commands/init.py +174 -0
  43. praisonai_code/cli/commands/knowledge.py +440 -0
  44. praisonai_code/cli/commands/langextract.py +120 -0
  45. praisonai_code/cli/commands/langfuse.py +984 -0
  46. praisonai_code/cli/commands/loop.py +211 -0
  47. praisonai_code/cli/commands/lsp.py +112 -0
  48. praisonai_code/cli/commands/managed.py +659 -0
  49. praisonai_code/cli/commands/mcp.py +763 -0
  50. praisonai_code/cli/commands/memory.py +298 -0
  51. praisonai_code/cli/commands/models.py +264 -0
  52. praisonai_code/cli/commands/n8n.py +326 -0
  53. praisonai_code/cli/commands/obs.py +19 -0
  54. praisonai_code/cli/commands/package.py +76 -0
  55. praisonai_code/cli/commands/paths.py +106 -0
  56. praisonai_code/cli/commands/permissions.py +272 -0
  57. praisonai_code/cli/commands/plugins.py +609 -0
  58. praisonai_code/cli/commands/port.py +530 -0
  59. praisonai_code/cli/commands/profile.py +466 -0
  60. praisonai_code/cli/commands/publish.py +193 -0
  61. praisonai_code/cli/commands/rag.py +913 -0
  62. praisonai_code/cli/commands/realtime.py +52 -0
  63. praisonai_code/cli/commands/recipe.py +684 -0
  64. praisonai_code/cli/commands/registry.py +59 -0
  65. praisonai_code/cli/commands/replay.py +830 -0
  66. praisonai_code/cli/commands/research.py +49 -0
  67. praisonai_code/cli/commands/retrieval.py +377 -0
  68. praisonai_code/cli/commands/rules.py +71 -0
  69. praisonai_code/cli/commands/run.py +1573 -0
  70. praisonai_code/cli/commands/sandbox.py +371 -0
  71. praisonai_code/cli/commands/schedule.py +529 -0
  72. praisonai_code/cli/commands/serve.py +690 -0
  73. praisonai_code/cli/commands/session.py +450 -0
  74. praisonai_code/cli/commands/setup.py +174 -0
  75. praisonai_code/cli/commands/skills.py +545 -0
  76. praisonai_code/cli/commands/standardise.py +711 -0
  77. praisonai_code/cli/commands/templates.py +54 -0
  78. praisonai_code/cli/commands/test.py +558 -0
  79. praisonai_code/cli/commands/todo.py +74 -0
  80. praisonai_code/cli/commands/tools.py +205 -0
  81. praisonai_code/cli/commands/traces.py +145 -0
  82. praisonai_code/cli/commands/tracker.py +852 -0
  83. praisonai_code/cli/commands/train.py +613 -0
  84. praisonai_code/cli/commands/ui.py +172 -0
  85. praisonai_code/cli/commands/up.py +354 -0
  86. praisonai_code/cli/commands/validate.py +291 -0
  87. praisonai_code/cli/commands/version.py +101 -0
  88. praisonai_code/cli/commands/workflow.py +97 -0
  89. praisonai_code/cli/config_loader.py +437 -0
  90. praisonai_code/cli/configuration/__init__.py +27 -0
  91. praisonai_code/cli/configuration/config.schema.json +57 -0
  92. praisonai_code/cli/configuration/credentials.py +446 -0
  93. praisonai_code/cli/configuration/loader.py +364 -0
  94. praisonai_code/cli/configuration/model_resolver.py +161 -0
  95. praisonai_code/cli/configuration/oauth.py +389 -0
  96. praisonai_code/cli/configuration/paths.py +224 -0
  97. praisonai_code/cli/configuration/resolver.py +687 -0
  98. praisonai_code/cli/configuration/schema.py +317 -0
  99. praisonai_code/cli/execution/__init__.py +99 -0
  100. praisonai_code/cli/execution/core.py +208 -0
  101. praisonai_code/cli/execution/profiler.py +898 -0
  102. praisonai_code/cli/execution/request.py +85 -0
  103. praisonai_code/cli/execution/result.py +74 -0
  104. praisonai_code/cli/fallback_schema.py +416 -0
  105. praisonai_code/cli/features/__init__.py +278 -0
  106. praisonai_code/cli/features/_endpoint_registry.py +64 -0
  107. praisonai_code/cli/features/_search_registry.py +43 -0
  108. praisonai_code/cli/features/acp.py +236 -0
  109. praisonai_code/cli/features/action_orchestrator.py +576 -0
  110. praisonai_code/cli/features/agent_scheduler.py +773 -0
  111. praisonai_code/cli/features/agent_tools.py +603 -0
  112. praisonai_code/cli/features/agents.py +397 -0
  113. praisonai_code/cli/features/at_mentions.py +471 -0
  114. praisonai_code/cli/features/audit_cli.py +270 -0
  115. praisonai_code/cli/features/auto_memory.py +182 -0
  116. praisonai_code/cli/features/auto_mode.py +552 -0
  117. praisonai_code/cli/features/autonomy_mode.py +546 -0
  118. praisonai_code/cli/features/background.py +356 -0
  119. praisonai_code/cli/features/base.py +168 -0
  120. praisonai_code/cli/features/benchmark.py +1462 -0
  121. praisonai_code/cli/features/capabilities.py +1326 -0
  122. praisonai_code/cli/features/checkpoints.py +345 -0
  123. praisonai_code/cli/features/cli_profiler.py +335 -0
  124. praisonai_code/cli/features/code_intelligence.py +666 -0
  125. praisonai_code/cli/features/compaction.py +294 -0
  126. praisonai_code/cli/features/compare.py +534 -0
  127. praisonai_code/cli/features/config_hierarchy.py +366 -0
  128. praisonai_code/cli/features/context_manager.py +597 -0
  129. praisonai_code/cli/features/cost_tracker.py +514 -0
  130. praisonai_code/cli/features/csv_test_runner.py +736 -0
  131. praisonai_code/cli/features/custom_definitions.py +790 -0
  132. praisonai_code/cli/features/debug.py +810 -0
  133. praisonai_code/cli/features/deploy.py +605 -0
  134. praisonai_code/cli/features/diag.py +289 -0
  135. praisonai_code/cli/features/display_jsonl.py +173 -0
  136. praisonai_code/cli/features/doctor/__init__.py +63 -0
  137. praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
  138. praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
  139. praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
  140. praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
  141. praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
  142. praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
  143. praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
  144. praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
  145. praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
  146. praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
  147. praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
  148. praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
  149. praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
  150. praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
  151. praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
  152. praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
  153. praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
  154. praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
  155. praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
  156. praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
  157. praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
  158. praisonai_code/cli/features/doctor/engine.py +266 -0
  159. praisonai_code/cli/features/doctor/formatters.py +377 -0
  160. praisonai_code/cli/features/doctor/handler.py +564 -0
  161. praisonai_code/cli/features/doctor/models.py +276 -0
  162. praisonai_code/cli/features/doctor/registry.py +239 -0
  163. praisonai_code/cli/features/endpoints.py +1016 -0
  164. praisonai_code/cli/features/eval.py +559 -0
  165. praisonai_code/cli/features/examples.py +707 -0
  166. praisonai_code/cli/features/external_agents.py +231 -0
  167. praisonai_code/cli/features/fast_context.py +410 -0
  168. praisonai_code/cli/features/file_history.py +320 -0
  169. praisonai_code/cli/features/flow_display.py +566 -0
  170. praisonai_code/cli/features/git_attribution.py +159 -0
  171. praisonai_code/cli/features/git_integration.py +651 -0
  172. praisonai_code/cli/features/guardrail.py +171 -0
  173. praisonai_code/cli/features/handoff.py +252 -0
  174. praisonai_code/cli/features/hooks.py +583 -0
  175. praisonai_code/cli/features/hybrid_workflow.py +391 -0
  176. praisonai_code/cli/features/image.py +384 -0
  177. praisonai_code/cli/features/interactive_core_headless.py +450 -0
  178. praisonai_code/cli/features/interactive_runtime.py +600 -0
  179. praisonai_code/cli/features/interactive_test_harness.py +537 -0
  180. praisonai_code/cli/features/interactive_tools.py +428 -0
  181. praisonai_code/cli/features/interactive_tui.py +603 -0
  182. praisonai_code/cli/features/job_workflow.py +906 -0
  183. praisonai_code/cli/features/jobs.py +632 -0
  184. praisonai_code/cli/features/knowledge.py +531 -0
  185. praisonai_code/cli/features/knowledge_cli.py +438 -0
  186. praisonai_code/cli/features/lite.py +244 -0
  187. praisonai_code/cli/features/logs.py +200 -0
  188. praisonai_code/cli/features/lsp_cli.py +225 -0
  189. praisonai_code/cli/features/lsp_diagnostics.py +185 -0
  190. praisonai_code/cli/features/mcp.py +344 -0
  191. praisonai_code/cli/features/message_queue.py +587 -0
  192. praisonai_code/cli/features/metrics.py +210 -0
  193. praisonai_code/cli/features/migrate.py +1329 -0
  194. praisonai_code/cli/features/migration_flow.py +463 -0
  195. praisonai_code/cli/features/migration_spec.py +276 -0
  196. praisonai_code/cli/features/n8n.py +703 -0
  197. praisonai_code/cli/features/observability.py +293 -0
  198. praisonai_code/cli/features/ollama.py +361 -0
  199. praisonai_code/cli/features/output_modes.py +155 -0
  200. praisonai_code/cli/features/output_style.py +273 -0
  201. praisonai_code/cli/features/package.py +631 -0
  202. praisonai_code/cli/features/performance.py +308 -0
  203. praisonai_code/cli/features/persistence.py +636 -0
  204. praisonai_code/cli/features/profiler/__init__.py +81 -0
  205. praisonai_code/cli/features/profiler/core.py +558 -0
  206. praisonai_code/cli/features/profiler/optimizations.py +652 -0
  207. praisonai_code/cli/features/profiler/suite.py +386 -0
  208. praisonai_code/cli/features/queue/__init__.py +73 -0
  209. praisonai_code/cli/features/queue/manager.py +435 -0
  210. praisonai_code/cli/features/queue/models.py +289 -0
  211. praisonai_code/cli/features/queue/persistence.py +564 -0
  212. praisonai_code/cli/features/queue/scheduler.py +529 -0
  213. praisonai_code/cli/features/queue/worker.py +400 -0
  214. praisonai_code/cli/features/recipe.py +2187 -0
  215. praisonai_code/cli/features/recipe_creator.py +996 -0
  216. praisonai_code/cli/features/recipe_optimizer.py +1364 -0
  217. praisonai_code/cli/features/recipe_prompts.py +226 -0
  218. praisonai_code/cli/features/registry.py +229 -0
  219. praisonai_code/cli/features/repo_map.py +860 -0
  220. praisonai_code/cli/features/router.py +466 -0
  221. praisonai_code/cli/features/safe_shell.py +427 -0
  222. praisonai_code/cli/features/sandbox_cli.py +283 -0
  223. praisonai_code/cli/features/sandbox_executor.py +536 -0
  224. praisonai_code/cli/features/sdk_knowledge.py +500 -0
  225. praisonai_code/cli/features/session.py +222 -0
  226. praisonai_code/cli/features/session_checkpoints.py +208 -0
  227. praisonai_code/cli/features/setup/__init__.py +9 -0
  228. praisonai_code/cli/features/setup/handler.py +355 -0
  229. praisonai_code/cli/features/setup/templates.py +62 -0
  230. praisonai_code/cli/features/skills.py +940 -0
  231. praisonai_code/cli/features/slash_commands.py +692 -0
  232. praisonai_code/cli/features/telemetry.py +179 -0
  233. praisonai_code/cli/features/templates.py +1390 -0
  234. praisonai_code/cli/features/thinking.py +343 -0
  235. praisonai_code/cli/features/todo.py +334 -0
  236. praisonai_code/cli/features/tools.py +680 -0
  237. praisonai_code/cli/features/tui/__init__.py +83 -0
  238. praisonai_code/cli/features/tui/app.py +871 -0
  239. praisonai_code/cli/features/tui/cli.py +580 -0
  240. praisonai_code/cli/features/tui/config.py +150 -0
  241. praisonai_code/cli/features/tui/debug.py +526 -0
  242. praisonai_code/cli/features/tui/events.py +99 -0
  243. praisonai_code/cli/features/tui/mock_provider.py +328 -0
  244. praisonai_code/cli/features/tui/orchestrator.py +652 -0
  245. praisonai_code/cli/features/tui/screens/__init__.py +50 -0
  246. praisonai_code/cli/features/tui/screens/help.py +157 -0
  247. praisonai_code/cli/features/tui/screens/main.py +568 -0
  248. praisonai_code/cli/features/tui/screens/queue.py +174 -0
  249. praisonai_code/cli/features/tui/screens/session.py +124 -0
  250. praisonai_code/cli/features/tui/screens/settings.py +148 -0
  251. praisonai_code/cli/features/tui/session_store.py +198 -0
  252. praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
  253. praisonai_code/cli/features/tui/widgets/chat.py +263 -0
  254. praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
  255. praisonai_code/cli/features/tui/widgets/composer.py +292 -0
  256. praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
  257. praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
  258. praisonai_code/cli/features/tui/widgets/status.py +181 -0
  259. praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
  260. praisonai_code/cli/features/wizard.py +289 -0
  261. praisonai_code/cli/features/workflow.py +802 -0
  262. praisonai_code/cli/features/yaml_utils.py +321 -0
  263. praisonai_code/cli/interactive/__init__.py +48 -0
  264. praisonai_code/cli/interactive/async_tui.py +1218 -0
  265. praisonai_code/cli/interactive/config.py +139 -0
  266. praisonai_code/cli/interactive/core.py +618 -0
  267. praisonai_code/cli/interactive/events.py +131 -0
  268. praisonai_code/cli/interactive/frontends/__init__.py +31 -0
  269. praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
  270. praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
  271. praisonai_code/cli/interactive/praison_io.py +502 -0
  272. praisonai_code/cli/interactive/repl.py +297 -0
  273. praisonai_code/cli/interactive/split_tui.py +456 -0
  274. praisonai_code/cli/interactive/tui_app.py +457 -0
  275. praisonai_code/cli/langfuse_client.py +360 -0
  276. praisonai_code/cli/main.py +7421 -0
  277. praisonai_code/cli/output/__init__.py +25 -0
  278. praisonai_code/cli/output/console.py +456 -0
  279. praisonai_code/cli/output/event_bridge.py +191 -0
  280. praisonai_code/cli/schedule_cli.py +54 -0
  281. praisonai_code/cli/schema_provider.py +23 -0
  282. praisonai_code/cli/session/__init__.py +16 -0
  283. praisonai_code/cli/session/resume.py +148 -0
  284. praisonai_code/cli/session/unified.py +548 -0
  285. praisonai_code/cli/state/__init__.py +31 -0
  286. praisonai_code/cli/state/identifiers.py +161 -0
  287. praisonai_code/cli/state/project_sessions.py +383 -0
  288. praisonai_code/cli/state/sessions.py +390 -0
  289. praisonai_code/cli/ui/__init__.py +160 -0
  290. praisonai_code/cli/ui/config.py +46 -0
  291. praisonai_code/cli/ui/events.py +61 -0
  292. praisonai_code/cli/ui/mg_backend.py +342 -0
  293. praisonai_code/cli/ui/plain.py +133 -0
  294. praisonai_code/cli/ui/rich_backend.py +162 -0
  295. praisonai_code/cli/unified_schema.py +655 -0
  296. praisonai_code/cli/utils/env_utils.py +126 -0
  297. praisonai_code/cli/utils/project.py +131 -0
  298. praisonai_code/cli_backends/__init__.py +73 -0
  299. praisonai_code/cli_backends/claude.py +373 -0
  300. praisonai_code/cli_backends/registry.py +113 -0
  301. praisonai_code/runtime/__init__.py +36 -0
  302. praisonai_code/runtime/__main__.py +81 -0
  303. praisonai_code/runtime/client.py +131 -0
  304. praisonai_code/runtime/descriptor.py +209 -0
  305. praisonai_code/runtime/server.py +356 -0
  306. praisonai_code-0.0.1.dist-info/METADATA +80 -0
  307. praisonai_code-0.0.1.dist-info/RECORD +309 -0
  308. praisonai_code-0.0.1.dist-info/WHEEL +5 -0
  309. 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