PraisonAI 3.0.0__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 (393) hide show
  1. praisonai/__init__.py +54 -0
  2. praisonai/__main__.py +15 -0
  3. praisonai/acp/__init__.py +54 -0
  4. praisonai/acp/config.py +159 -0
  5. praisonai/acp/server.py +587 -0
  6. praisonai/acp/session.py +219 -0
  7. praisonai/adapters/__init__.py +50 -0
  8. praisonai/adapters/readers.py +395 -0
  9. praisonai/adapters/rerankers.py +315 -0
  10. praisonai/adapters/retrievers.py +394 -0
  11. praisonai/adapters/vector_stores.py +409 -0
  12. praisonai/agent_scheduler.py +337 -0
  13. praisonai/agents_generator.py +903 -0
  14. praisonai/api/call.py +292 -0
  15. praisonai/auto.py +1197 -0
  16. praisonai/capabilities/__init__.py +275 -0
  17. praisonai/capabilities/a2a.py +140 -0
  18. praisonai/capabilities/assistants.py +283 -0
  19. praisonai/capabilities/audio.py +320 -0
  20. praisonai/capabilities/batches.py +469 -0
  21. praisonai/capabilities/completions.py +336 -0
  22. praisonai/capabilities/container_files.py +155 -0
  23. praisonai/capabilities/containers.py +93 -0
  24. praisonai/capabilities/embeddings.py +158 -0
  25. praisonai/capabilities/files.py +467 -0
  26. praisonai/capabilities/fine_tuning.py +293 -0
  27. praisonai/capabilities/guardrails.py +182 -0
  28. praisonai/capabilities/images.py +330 -0
  29. praisonai/capabilities/mcp.py +190 -0
  30. praisonai/capabilities/messages.py +270 -0
  31. praisonai/capabilities/moderations.py +154 -0
  32. praisonai/capabilities/ocr.py +217 -0
  33. praisonai/capabilities/passthrough.py +204 -0
  34. praisonai/capabilities/rag.py +207 -0
  35. praisonai/capabilities/realtime.py +160 -0
  36. praisonai/capabilities/rerank.py +165 -0
  37. praisonai/capabilities/responses.py +266 -0
  38. praisonai/capabilities/search.py +109 -0
  39. praisonai/capabilities/skills.py +133 -0
  40. praisonai/capabilities/vector_store_files.py +334 -0
  41. praisonai/capabilities/vector_stores.py +304 -0
  42. praisonai/capabilities/videos.py +141 -0
  43. praisonai/chainlit_ui.py +304 -0
  44. praisonai/chat/__init__.py +106 -0
  45. praisonai/chat/app.py +125 -0
  46. praisonai/cli/__init__.py +26 -0
  47. praisonai/cli/app.py +213 -0
  48. praisonai/cli/commands/__init__.py +75 -0
  49. praisonai/cli/commands/acp.py +70 -0
  50. praisonai/cli/commands/completion.py +333 -0
  51. praisonai/cli/commands/config.py +166 -0
  52. praisonai/cli/commands/debug.py +142 -0
  53. praisonai/cli/commands/diag.py +55 -0
  54. praisonai/cli/commands/doctor.py +166 -0
  55. praisonai/cli/commands/environment.py +179 -0
  56. praisonai/cli/commands/lsp.py +112 -0
  57. praisonai/cli/commands/mcp.py +210 -0
  58. praisonai/cli/commands/profile.py +457 -0
  59. praisonai/cli/commands/run.py +228 -0
  60. praisonai/cli/commands/schedule.py +150 -0
  61. praisonai/cli/commands/serve.py +97 -0
  62. praisonai/cli/commands/session.py +212 -0
  63. praisonai/cli/commands/traces.py +145 -0
  64. praisonai/cli/commands/version.py +101 -0
  65. praisonai/cli/configuration/__init__.py +18 -0
  66. praisonai/cli/configuration/loader.py +353 -0
  67. praisonai/cli/configuration/paths.py +114 -0
  68. praisonai/cli/configuration/schema.py +164 -0
  69. praisonai/cli/features/__init__.py +268 -0
  70. praisonai/cli/features/acp.py +236 -0
  71. praisonai/cli/features/action_orchestrator.py +546 -0
  72. praisonai/cli/features/agent_scheduler.py +773 -0
  73. praisonai/cli/features/agent_tools.py +474 -0
  74. praisonai/cli/features/agents.py +375 -0
  75. praisonai/cli/features/at_mentions.py +471 -0
  76. praisonai/cli/features/auto_memory.py +182 -0
  77. praisonai/cli/features/autonomy_mode.py +490 -0
  78. praisonai/cli/features/background.py +356 -0
  79. praisonai/cli/features/base.py +168 -0
  80. praisonai/cli/features/capabilities.py +1326 -0
  81. praisonai/cli/features/checkpoints.py +338 -0
  82. praisonai/cli/features/code_intelligence.py +652 -0
  83. praisonai/cli/features/compaction.py +294 -0
  84. praisonai/cli/features/compare.py +534 -0
  85. praisonai/cli/features/cost_tracker.py +514 -0
  86. praisonai/cli/features/debug.py +810 -0
  87. praisonai/cli/features/deploy.py +517 -0
  88. praisonai/cli/features/diag.py +289 -0
  89. praisonai/cli/features/doctor/__init__.py +63 -0
  90. praisonai/cli/features/doctor/checks/__init__.py +24 -0
  91. praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
  92. praisonai/cli/features/doctor/checks/config_checks.py +366 -0
  93. praisonai/cli/features/doctor/checks/db_checks.py +366 -0
  94. praisonai/cli/features/doctor/checks/env_checks.py +543 -0
  95. praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
  96. praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
  97. praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
  98. praisonai/cli/features/doctor/checks/network_checks.py +251 -0
  99. praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
  100. praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
  101. praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
  102. praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
  103. praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
  104. praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
  105. praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
  106. praisonai/cli/features/doctor/engine.py +266 -0
  107. praisonai/cli/features/doctor/formatters.py +310 -0
  108. praisonai/cli/features/doctor/handler.py +397 -0
  109. praisonai/cli/features/doctor/models.py +264 -0
  110. praisonai/cli/features/doctor/registry.py +239 -0
  111. praisonai/cli/features/endpoints.py +1019 -0
  112. praisonai/cli/features/eval.py +560 -0
  113. praisonai/cli/features/external_agents.py +231 -0
  114. praisonai/cli/features/fast_context.py +410 -0
  115. praisonai/cli/features/flow_display.py +566 -0
  116. praisonai/cli/features/git_integration.py +651 -0
  117. praisonai/cli/features/guardrail.py +171 -0
  118. praisonai/cli/features/handoff.py +185 -0
  119. praisonai/cli/features/hooks.py +583 -0
  120. praisonai/cli/features/image.py +384 -0
  121. praisonai/cli/features/interactive_runtime.py +585 -0
  122. praisonai/cli/features/interactive_tools.py +380 -0
  123. praisonai/cli/features/interactive_tui.py +603 -0
  124. praisonai/cli/features/jobs.py +632 -0
  125. praisonai/cli/features/knowledge.py +531 -0
  126. praisonai/cli/features/lite.py +244 -0
  127. praisonai/cli/features/lsp_cli.py +225 -0
  128. praisonai/cli/features/mcp.py +169 -0
  129. praisonai/cli/features/message_queue.py +587 -0
  130. praisonai/cli/features/metrics.py +211 -0
  131. praisonai/cli/features/n8n.py +673 -0
  132. praisonai/cli/features/observability.py +293 -0
  133. praisonai/cli/features/ollama.py +361 -0
  134. praisonai/cli/features/output_style.py +273 -0
  135. praisonai/cli/features/package.py +631 -0
  136. praisonai/cli/features/performance.py +308 -0
  137. praisonai/cli/features/persistence.py +636 -0
  138. praisonai/cli/features/profile.py +226 -0
  139. praisonai/cli/features/profiler/__init__.py +81 -0
  140. praisonai/cli/features/profiler/core.py +558 -0
  141. praisonai/cli/features/profiler/optimizations.py +652 -0
  142. praisonai/cli/features/profiler/suite.py +386 -0
  143. praisonai/cli/features/profiling.py +350 -0
  144. praisonai/cli/features/queue/__init__.py +73 -0
  145. praisonai/cli/features/queue/manager.py +395 -0
  146. praisonai/cli/features/queue/models.py +286 -0
  147. praisonai/cli/features/queue/persistence.py +564 -0
  148. praisonai/cli/features/queue/scheduler.py +484 -0
  149. praisonai/cli/features/queue/worker.py +372 -0
  150. praisonai/cli/features/recipe.py +1723 -0
  151. praisonai/cli/features/recipes.py +449 -0
  152. praisonai/cli/features/registry.py +229 -0
  153. praisonai/cli/features/repo_map.py +860 -0
  154. praisonai/cli/features/router.py +466 -0
  155. praisonai/cli/features/sandbox_executor.py +515 -0
  156. praisonai/cli/features/serve.py +829 -0
  157. praisonai/cli/features/session.py +222 -0
  158. praisonai/cli/features/skills.py +856 -0
  159. praisonai/cli/features/slash_commands.py +650 -0
  160. praisonai/cli/features/telemetry.py +179 -0
  161. praisonai/cli/features/templates.py +1384 -0
  162. praisonai/cli/features/thinking.py +305 -0
  163. praisonai/cli/features/todo.py +334 -0
  164. praisonai/cli/features/tools.py +680 -0
  165. praisonai/cli/features/tui/__init__.py +83 -0
  166. praisonai/cli/features/tui/app.py +580 -0
  167. praisonai/cli/features/tui/cli.py +566 -0
  168. praisonai/cli/features/tui/debug.py +511 -0
  169. praisonai/cli/features/tui/events.py +99 -0
  170. praisonai/cli/features/tui/mock_provider.py +328 -0
  171. praisonai/cli/features/tui/orchestrator.py +652 -0
  172. praisonai/cli/features/tui/screens/__init__.py +50 -0
  173. praisonai/cli/features/tui/screens/main.py +245 -0
  174. praisonai/cli/features/tui/screens/queue.py +174 -0
  175. praisonai/cli/features/tui/screens/session.py +124 -0
  176. praisonai/cli/features/tui/screens/settings.py +148 -0
  177. praisonai/cli/features/tui/widgets/__init__.py +56 -0
  178. praisonai/cli/features/tui/widgets/chat.py +261 -0
  179. praisonai/cli/features/tui/widgets/composer.py +224 -0
  180. praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
  181. praisonai/cli/features/tui/widgets/status.py +167 -0
  182. praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
  183. praisonai/cli/features/workflow.py +720 -0
  184. praisonai/cli/legacy.py +236 -0
  185. praisonai/cli/main.py +5559 -0
  186. praisonai/cli/schedule_cli.py +54 -0
  187. praisonai/cli/state/__init__.py +31 -0
  188. praisonai/cli/state/identifiers.py +161 -0
  189. praisonai/cli/state/sessions.py +313 -0
  190. praisonai/code/__init__.py +93 -0
  191. praisonai/code/agent_tools.py +344 -0
  192. praisonai/code/diff/__init__.py +21 -0
  193. praisonai/code/diff/diff_strategy.py +432 -0
  194. praisonai/code/tools/__init__.py +27 -0
  195. praisonai/code/tools/apply_diff.py +221 -0
  196. praisonai/code/tools/execute_command.py +275 -0
  197. praisonai/code/tools/list_files.py +274 -0
  198. praisonai/code/tools/read_file.py +206 -0
  199. praisonai/code/tools/search_replace.py +248 -0
  200. praisonai/code/tools/write_file.py +217 -0
  201. praisonai/code/utils/__init__.py +46 -0
  202. praisonai/code/utils/file_utils.py +307 -0
  203. praisonai/code/utils/ignore_utils.py +308 -0
  204. praisonai/code/utils/text_utils.py +276 -0
  205. praisonai/db/__init__.py +64 -0
  206. praisonai/db/adapter.py +531 -0
  207. praisonai/deploy/__init__.py +62 -0
  208. praisonai/deploy/api.py +231 -0
  209. praisonai/deploy/docker.py +454 -0
  210. praisonai/deploy/doctor.py +367 -0
  211. praisonai/deploy/main.py +327 -0
  212. praisonai/deploy/models.py +179 -0
  213. praisonai/deploy/providers/__init__.py +33 -0
  214. praisonai/deploy/providers/aws.py +331 -0
  215. praisonai/deploy/providers/azure.py +358 -0
  216. praisonai/deploy/providers/base.py +101 -0
  217. praisonai/deploy/providers/gcp.py +314 -0
  218. praisonai/deploy/schema.py +208 -0
  219. praisonai/deploy.py +185 -0
  220. praisonai/endpoints/__init__.py +53 -0
  221. praisonai/endpoints/a2u_server.py +410 -0
  222. praisonai/endpoints/discovery.py +165 -0
  223. praisonai/endpoints/providers/__init__.py +28 -0
  224. praisonai/endpoints/providers/a2a.py +253 -0
  225. praisonai/endpoints/providers/a2u.py +208 -0
  226. praisonai/endpoints/providers/agents_api.py +171 -0
  227. praisonai/endpoints/providers/base.py +231 -0
  228. praisonai/endpoints/providers/mcp.py +263 -0
  229. praisonai/endpoints/providers/recipe.py +206 -0
  230. praisonai/endpoints/providers/tools_mcp.py +150 -0
  231. praisonai/endpoints/registry.py +131 -0
  232. praisonai/endpoints/server.py +161 -0
  233. praisonai/inbuilt_tools/__init__.py +24 -0
  234. praisonai/inbuilt_tools/autogen_tools.py +117 -0
  235. praisonai/inc/__init__.py +2 -0
  236. praisonai/inc/config.py +96 -0
  237. praisonai/inc/models.py +155 -0
  238. praisonai/integrations/__init__.py +56 -0
  239. praisonai/integrations/base.py +303 -0
  240. praisonai/integrations/claude_code.py +270 -0
  241. praisonai/integrations/codex_cli.py +255 -0
  242. praisonai/integrations/cursor_cli.py +195 -0
  243. praisonai/integrations/gemini_cli.py +222 -0
  244. praisonai/jobs/__init__.py +67 -0
  245. praisonai/jobs/executor.py +425 -0
  246. praisonai/jobs/models.py +230 -0
  247. praisonai/jobs/router.py +314 -0
  248. praisonai/jobs/server.py +186 -0
  249. praisonai/jobs/store.py +203 -0
  250. praisonai/llm/__init__.py +66 -0
  251. praisonai/llm/registry.py +382 -0
  252. praisonai/mcp_server/__init__.py +152 -0
  253. praisonai/mcp_server/adapters/__init__.py +74 -0
  254. praisonai/mcp_server/adapters/agents.py +128 -0
  255. praisonai/mcp_server/adapters/capabilities.py +168 -0
  256. praisonai/mcp_server/adapters/cli_tools.py +568 -0
  257. praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
  258. praisonai/mcp_server/adapters/knowledge.py +93 -0
  259. praisonai/mcp_server/adapters/memory.py +104 -0
  260. praisonai/mcp_server/adapters/prompts.py +306 -0
  261. praisonai/mcp_server/adapters/resources.py +124 -0
  262. praisonai/mcp_server/adapters/tools_bridge.py +280 -0
  263. praisonai/mcp_server/auth/__init__.py +48 -0
  264. praisonai/mcp_server/auth/api_key.py +291 -0
  265. praisonai/mcp_server/auth/oauth.py +460 -0
  266. praisonai/mcp_server/auth/oidc.py +289 -0
  267. praisonai/mcp_server/auth/scopes.py +260 -0
  268. praisonai/mcp_server/cli.py +852 -0
  269. praisonai/mcp_server/elicitation.py +445 -0
  270. praisonai/mcp_server/icons.py +302 -0
  271. praisonai/mcp_server/recipe_adapter.py +573 -0
  272. praisonai/mcp_server/recipe_cli.py +824 -0
  273. praisonai/mcp_server/registry.py +703 -0
  274. praisonai/mcp_server/sampling.py +422 -0
  275. praisonai/mcp_server/server.py +490 -0
  276. praisonai/mcp_server/tasks.py +443 -0
  277. praisonai/mcp_server/transports/__init__.py +18 -0
  278. praisonai/mcp_server/transports/http_stream.py +376 -0
  279. praisonai/mcp_server/transports/stdio.py +132 -0
  280. praisonai/persistence/__init__.py +84 -0
  281. praisonai/persistence/config.py +238 -0
  282. praisonai/persistence/conversation/__init__.py +25 -0
  283. praisonai/persistence/conversation/async_mysql.py +427 -0
  284. praisonai/persistence/conversation/async_postgres.py +410 -0
  285. praisonai/persistence/conversation/async_sqlite.py +371 -0
  286. praisonai/persistence/conversation/base.py +151 -0
  287. praisonai/persistence/conversation/json_store.py +250 -0
  288. praisonai/persistence/conversation/mysql.py +387 -0
  289. praisonai/persistence/conversation/postgres.py +401 -0
  290. praisonai/persistence/conversation/singlestore.py +240 -0
  291. praisonai/persistence/conversation/sqlite.py +341 -0
  292. praisonai/persistence/conversation/supabase.py +203 -0
  293. praisonai/persistence/conversation/surrealdb.py +287 -0
  294. praisonai/persistence/factory.py +301 -0
  295. praisonai/persistence/hooks/__init__.py +18 -0
  296. praisonai/persistence/hooks/agent_hooks.py +297 -0
  297. praisonai/persistence/knowledge/__init__.py +26 -0
  298. praisonai/persistence/knowledge/base.py +144 -0
  299. praisonai/persistence/knowledge/cassandra.py +232 -0
  300. praisonai/persistence/knowledge/chroma.py +295 -0
  301. praisonai/persistence/knowledge/clickhouse.py +242 -0
  302. praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
  303. praisonai/persistence/knowledge/couchbase.py +286 -0
  304. praisonai/persistence/knowledge/lancedb.py +216 -0
  305. praisonai/persistence/knowledge/langchain_adapter.py +291 -0
  306. praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
  307. praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
  308. praisonai/persistence/knowledge/milvus.py +277 -0
  309. praisonai/persistence/knowledge/mongodb_vector.py +306 -0
  310. praisonai/persistence/knowledge/pgvector.py +335 -0
  311. praisonai/persistence/knowledge/pinecone.py +253 -0
  312. praisonai/persistence/knowledge/qdrant.py +301 -0
  313. praisonai/persistence/knowledge/redis_vector.py +291 -0
  314. praisonai/persistence/knowledge/singlestore_vector.py +299 -0
  315. praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
  316. praisonai/persistence/knowledge/upstash_vector.py +266 -0
  317. praisonai/persistence/knowledge/weaviate.py +223 -0
  318. praisonai/persistence/migrations/__init__.py +10 -0
  319. praisonai/persistence/migrations/manager.py +251 -0
  320. praisonai/persistence/orchestrator.py +406 -0
  321. praisonai/persistence/state/__init__.py +21 -0
  322. praisonai/persistence/state/async_mongodb.py +200 -0
  323. praisonai/persistence/state/base.py +107 -0
  324. praisonai/persistence/state/dynamodb.py +226 -0
  325. praisonai/persistence/state/firestore.py +175 -0
  326. praisonai/persistence/state/gcs.py +155 -0
  327. praisonai/persistence/state/memory.py +245 -0
  328. praisonai/persistence/state/mongodb.py +158 -0
  329. praisonai/persistence/state/redis.py +190 -0
  330. praisonai/persistence/state/upstash.py +144 -0
  331. praisonai/persistence/tests/__init__.py +3 -0
  332. praisonai/persistence/tests/test_all_backends.py +633 -0
  333. praisonai/profiler.py +1214 -0
  334. praisonai/recipe/__init__.py +134 -0
  335. praisonai/recipe/bridge.py +278 -0
  336. praisonai/recipe/core.py +893 -0
  337. praisonai/recipe/exceptions.py +54 -0
  338. praisonai/recipe/history.py +402 -0
  339. praisonai/recipe/models.py +266 -0
  340. praisonai/recipe/operations.py +440 -0
  341. praisonai/recipe/policy.py +422 -0
  342. praisonai/recipe/registry.py +849 -0
  343. praisonai/recipe/runtime.py +214 -0
  344. praisonai/recipe/security.py +711 -0
  345. praisonai/recipe/serve.py +859 -0
  346. praisonai/recipe/server.py +613 -0
  347. praisonai/scheduler/__init__.py +45 -0
  348. praisonai/scheduler/agent_scheduler.py +552 -0
  349. praisonai/scheduler/base.py +124 -0
  350. praisonai/scheduler/daemon_manager.py +225 -0
  351. praisonai/scheduler/state_manager.py +155 -0
  352. praisonai/scheduler/yaml_loader.py +193 -0
  353. praisonai/scheduler.py +194 -0
  354. praisonai/setup/__init__.py +1 -0
  355. praisonai/setup/build.py +21 -0
  356. praisonai/setup/post_install.py +23 -0
  357. praisonai/setup/setup_conda_env.py +25 -0
  358. praisonai/setup.py +16 -0
  359. praisonai/templates/__init__.py +116 -0
  360. praisonai/templates/cache.py +364 -0
  361. praisonai/templates/dependency_checker.py +358 -0
  362. praisonai/templates/discovery.py +391 -0
  363. praisonai/templates/loader.py +564 -0
  364. praisonai/templates/registry.py +511 -0
  365. praisonai/templates/resolver.py +206 -0
  366. praisonai/templates/security.py +327 -0
  367. praisonai/templates/tool_override.py +498 -0
  368. praisonai/templates/tools_doctor.py +256 -0
  369. praisonai/test.py +105 -0
  370. praisonai/train.py +562 -0
  371. praisonai/train_vision.py +306 -0
  372. praisonai/ui/agents.py +824 -0
  373. praisonai/ui/callbacks.py +57 -0
  374. praisonai/ui/chainlit_compat.py +246 -0
  375. praisonai/ui/chat.py +532 -0
  376. praisonai/ui/code.py +717 -0
  377. praisonai/ui/colab.py +474 -0
  378. praisonai/ui/colab_chainlit.py +81 -0
  379. praisonai/ui/components/aicoder.py +284 -0
  380. praisonai/ui/context.py +283 -0
  381. praisonai/ui/database_config.py +56 -0
  382. praisonai/ui/db.py +294 -0
  383. praisonai/ui/realtime.py +488 -0
  384. praisonai/ui/realtimeclient/__init__.py +756 -0
  385. praisonai/ui/realtimeclient/tools.py +242 -0
  386. praisonai/ui/sql_alchemy.py +710 -0
  387. praisonai/upload_vision.py +140 -0
  388. praisonai/version.py +1 -0
  389. praisonai-3.0.0.dist-info/METADATA +3493 -0
  390. praisonai-3.0.0.dist-info/RECORD +393 -0
  391. praisonai-3.0.0.dist-info/WHEEL +5 -0
  392. praisonai-3.0.0.dist-info/entry_points.txt +4 -0
  393. praisonai-3.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,350 @@
1
+ """
2
+ PraisonAI CLI Profiling Commands
3
+
4
+ Provides CLI commands for profiling agent execution.
5
+
6
+ Usage:
7
+ praisonai profile run "task" --output report.html
8
+ praisonai profile report --format json
9
+ praisonai profile benchmark --iterations 10
10
+ """
11
+
12
+ import time
13
+ import json
14
+ from typing import Optional, Dict, Any
15
+
16
+
17
+ class ProfilingHandler:
18
+ """
19
+ Handler for CLI profiling commands.
20
+
21
+ Features:
22
+ - Run tasks with profiling enabled
23
+ - Generate reports (console, JSON, HTML)
24
+ - Benchmark agent performance
25
+ - Export flamegraphs
26
+ """
27
+
28
+ def __init__(self):
29
+ self._profiler = None
30
+
31
+ @property
32
+ def profiler(self):
33
+ """Lazy load profiler."""
34
+ if self._profiler is None:
35
+ from praisonai.profiler import Profiler
36
+ self._profiler = Profiler
37
+ return self._profiler
38
+
39
+ def enable(self) -> None:
40
+ """Enable profiling."""
41
+ self.profiler.enable()
42
+
43
+ def disable(self) -> None:
44
+ """Disable profiling."""
45
+ self.profiler.disable()
46
+
47
+ def clear(self) -> None:
48
+ """Clear profiling data."""
49
+ self.profiler.clear()
50
+
51
+ def run_with_profiling(self, task: str, config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
52
+ """
53
+ Run a task with profiling enabled.
54
+
55
+ Args:
56
+ task: Task description or prompt
57
+ config: Optional configuration dict
58
+
59
+ Returns:
60
+ Dict with result and profiling data
61
+ """
62
+ self.profiler.enable()
63
+ self.profiler.clear()
64
+
65
+ result = None
66
+ error = None
67
+
68
+ try:
69
+ # Import and run PraisonAI
70
+ from praisonai import PraisonAI
71
+
72
+ with self.profiler.block("total_execution"):
73
+ with self.profiler.block("initialization"):
74
+ praison = PraisonAI(auto=task, **(config or {}))
75
+
76
+ with self.profiler.block("agent_run"):
77
+ result = praison.run()
78
+ except Exception as e:
79
+ error = str(e)
80
+ finally:
81
+ self.profiler.disable()
82
+
83
+ return {
84
+ 'result': result,
85
+ 'error': error,
86
+ 'summary': self.profiler.get_summary(),
87
+ 'statistics': self.profiler.get_statistics()
88
+ }
89
+
90
+ def report(self, format: str = "console", output: Optional[str] = None) -> str:
91
+ """
92
+ Generate profiling report.
93
+
94
+ Args:
95
+ format: Output format (console, json, html)
96
+ output: Optional file path to save report
97
+
98
+ Returns:
99
+ Report content as string
100
+ """
101
+ if format == "console":
102
+ content = self.profiler.report(output="console")
103
+ elif format == "json":
104
+ content = self.profiler.export_json()
105
+ elif format == "html":
106
+ content = self.profiler.export_html()
107
+ else:
108
+ raise ValueError(f"Unknown format: {format}")
109
+
110
+ if output:
111
+ with open(output, 'w') as f:
112
+ f.write(content)
113
+ print(f"Report saved to: {output}")
114
+
115
+ return content
116
+
117
+ def benchmark(self, task: str, iterations: int = 5,
118
+ warmup: int = 1, config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
119
+ """
120
+ Benchmark agent performance.
121
+
122
+ Args:
123
+ task: Task to benchmark
124
+ iterations: Number of iterations
125
+ warmup: Number of warmup runs
126
+ config: Optional configuration
127
+
128
+ Returns:
129
+ Benchmark results with statistics
130
+ """
131
+ from praisonai.profiler import Profiler
132
+
133
+ times = []
134
+ errors = []
135
+
136
+ # Warmup runs
137
+ for i in range(warmup):
138
+ print(f"Warmup {i + 1}/{warmup}...")
139
+ try:
140
+ self.run_with_profiling(task, config)
141
+ except Exception as e:
142
+ print(f"Warmup error: {e}")
143
+
144
+ # Benchmark runs
145
+ for i in range(iterations):
146
+ print(f"Iteration {i + 1}/{iterations}...")
147
+ Profiler.clear()
148
+
149
+ start = time.perf_counter()
150
+ try:
151
+ self.run_with_profiling(task, config)
152
+ duration_ms = (time.perf_counter() - start) * 1000
153
+ times.append(duration_ms)
154
+ except Exception as e:
155
+ errors.append(str(e))
156
+ duration_ms = (time.perf_counter() - start) * 1000
157
+ times.append(duration_ms)
158
+
159
+ # Calculate statistics
160
+ if times:
161
+ sorted_times = sorted(times)
162
+ n = len(sorted_times)
163
+
164
+ results = {
165
+ 'iterations': iterations,
166
+ 'successful': iterations - len(errors),
167
+ 'failed': len(errors),
168
+ 'times_ms': times,
169
+ 'mean_ms': sum(times) / n,
170
+ 'min_ms': min(times),
171
+ 'max_ms': max(times),
172
+ 'p50_ms': sorted_times[n // 2],
173
+ 'p95_ms': sorted_times[int(n * 0.95)] if n > 1 else sorted_times[-1],
174
+ 'p99_ms': sorted_times[int(n * 0.99)] if n > 1 else sorted_times[-1],
175
+ 'errors': errors
176
+ }
177
+ else:
178
+ results = {
179
+ 'iterations': iterations,
180
+ 'successful': 0,
181
+ 'failed': len(errors),
182
+ 'errors': errors
183
+ }
184
+
185
+ return results
186
+
187
+ def export_flamegraph(self, filepath: str) -> None:
188
+ """Export flamegraph to SVG file."""
189
+ self.profiler.export_flamegraph(filepath)
190
+ print(f"Flamegraph saved to: {filepath}")
191
+
192
+ def get_summary(self) -> Dict[str, Any]:
193
+ """Get profiling summary."""
194
+ return self.profiler.get_summary()
195
+
196
+ def get_statistics(self, category: Optional[str] = None) -> Dict[str, float]:
197
+ """Get profiling statistics."""
198
+ return self.profiler.get_statistics(category)
199
+
200
+ def print_summary(self) -> None:
201
+ """Print profiling summary to console."""
202
+ summary = self.get_summary()
203
+ stats = self.get_statistics()
204
+
205
+ print("\n" + "=" * 60)
206
+ print("PROFILING SUMMARY")
207
+ print("=" * 60)
208
+
209
+ print(f"\nTotal Time: {summary['total_time_ms']:.2f}ms")
210
+ print(f"Operations: {summary['timing_count']}")
211
+ print(f"Imports: {summary['import_count']}")
212
+ print(f"Flow Steps: {summary['flow_steps']}")
213
+
214
+ print("\nStatistics:")
215
+ print(f" P50 (Median): {stats['p50']:.2f}ms")
216
+ print(f" P95: {stats['p95']:.2f}ms")
217
+ print(f" P99: {stats['p99']:.2f}ms")
218
+ print(f" Mean: {stats['mean']:.2f}ms")
219
+ print(f" Std Dev: {stats['std_dev']:.2f}ms")
220
+
221
+ print("\nSlowest Operations:")
222
+ for name, duration in summary['slowest_operations'][:5]:
223
+ print(f" {name}: {duration:.2f}ms")
224
+
225
+ print("=" * 60)
226
+
227
+
228
+ def handle_profile_command(args) -> int:
229
+ """
230
+ Handle profile CLI command.
231
+
232
+ Args:
233
+ args: Parsed command line arguments
234
+
235
+ Returns:
236
+ Exit code (0 for success)
237
+ """
238
+ handler = ProfilingHandler()
239
+
240
+ subcommand = getattr(args, 'profile_command', None)
241
+
242
+ if subcommand == 'run':
243
+ task = getattr(args, 'task', '')
244
+ output = getattr(args, 'output', None)
245
+ format_type = getattr(args, 'format', 'console')
246
+
247
+ print(f"Running with profiling: {task[:50]}...")
248
+ result = handler.run_with_profiling(task)
249
+
250
+ if result['error']:
251
+ print(f"Error: {result['error']}")
252
+
253
+ handler.report(format=format_type, output=output)
254
+ return 0 if not result['error'] else 1
255
+
256
+ elif subcommand == 'report':
257
+ output = getattr(args, 'output', None)
258
+ format_type = getattr(args, 'format', 'console')
259
+
260
+ handler.report(format=format_type, output=output)
261
+ return 0
262
+
263
+ elif subcommand == 'benchmark':
264
+ task = getattr(args, 'task', '')
265
+ iterations = getattr(args, 'iterations', 5)
266
+ warmup = getattr(args, 'warmup', 1)
267
+ output = getattr(args, 'output', None)
268
+
269
+ print(f"Benchmarking: {task[:50]}...")
270
+ results = handler.benchmark(task, iterations=iterations, warmup=warmup)
271
+
272
+ print("\n" + "=" * 60)
273
+ print("BENCHMARK RESULTS")
274
+ print("=" * 60)
275
+ print(f"Iterations: {results['iterations']}")
276
+ print(f"Successful: {results['successful']}")
277
+ print(f"Failed: {results['failed']}")
278
+
279
+ if 'mean_ms' in results:
280
+ print("\nTiming:")
281
+ print(f" Mean: {results['mean_ms']:.2f}ms")
282
+ print(f" Min: {results['min_ms']:.2f}ms")
283
+ print(f" Max: {results['max_ms']:.2f}ms")
284
+ print(f" P50: {results['p50_ms']:.2f}ms")
285
+ print(f" P95: {results['p95_ms']:.2f}ms")
286
+
287
+ if output:
288
+ with open(output, 'w') as f:
289
+ json.dump(results, f, indent=2)
290
+ print(f"\nResults saved to: {output}")
291
+
292
+ return 0
293
+
294
+ elif subcommand == 'flamegraph':
295
+ output = getattr(args, 'output', 'profile.svg')
296
+ handler.export_flamegraph(output)
297
+ return 0
298
+
299
+ elif subcommand == 'summary':
300
+ handler.print_summary()
301
+ return 0
302
+
303
+ else:
304
+ print("Usage: praisonai profile <run|report|benchmark|flamegraph|summary>")
305
+ return 1
306
+
307
+
308
+ def add_profile_parser(subparsers) -> None:
309
+ """Add profile subcommand to argument parser."""
310
+ profile_parser = subparsers.add_parser(
311
+ 'profile',
312
+ help='Profile agent execution'
313
+ )
314
+
315
+ profile_subparsers = profile_parser.add_subparsers(dest='profile_command')
316
+
317
+ # Run with profiling
318
+ run_parser = profile_subparsers.add_parser('run', help='Run task with profiling')
319
+ run_parser.add_argument('task', help='Task to run')
320
+ run_parser.add_argument('--output', '-o', help='Output file path')
321
+ run_parser.add_argument('--format', '-f', choices=['console', 'json', 'html'],
322
+ default='console', help='Output format')
323
+
324
+ # Generate report
325
+ report_parser = profile_subparsers.add_parser('report', help='Generate profiling report')
326
+ report_parser.add_argument('--output', '-o', help='Output file path')
327
+ report_parser.add_argument('--format', '-f', choices=['console', 'json', 'html'],
328
+ default='console', help='Output format')
329
+
330
+ # Benchmark
331
+ bench_parser = profile_subparsers.add_parser('benchmark', help='Benchmark agent performance')
332
+ bench_parser.add_argument('task', help='Task to benchmark')
333
+ bench_parser.add_argument('--iterations', '-n', type=int, default=5, help='Number of iterations')
334
+ bench_parser.add_argument('--warmup', '-w', type=int, default=1, help='Warmup runs')
335
+ bench_parser.add_argument('--output', '-o', help='Output file for results')
336
+
337
+ # Flamegraph
338
+ flame_parser = profile_subparsers.add_parser('flamegraph', help='Export flamegraph')
339
+ flame_parser.add_argument('--output', '-o', default='profile.svg', help='Output SVG file')
340
+
341
+ # Summary
342
+ profile_subparsers.add_parser('summary', help='Print profiling summary') # noqa: F841
343
+
344
+
345
+ # Exports
346
+ __all__ = [
347
+ 'ProfilingHandler',
348
+ 'handle_profile_command',
349
+ 'add_profile_parser',
350
+ ]
@@ -0,0 +1,73 @@
1
+ """
2
+ Queue System for PraisonAI TUI.
3
+
4
+ Provides multi-run, multi-agent queueing with priorities, cancel/retry,
5
+ streaming output, and persistence.
6
+
7
+ Lazy-loaded to avoid import overhead when not used.
8
+ """
9
+
10
+ from typing import TYPE_CHECKING
11
+
12
+ if TYPE_CHECKING:
13
+ from .models import QueuedRun, RunState, RunPriority, QueueConfig
14
+ from .scheduler import QueueScheduler
15
+ from .worker import WorkerPool
16
+ from .persistence import QueuePersistence
17
+
18
+ _lazy_cache = {}
19
+
20
+
21
+ def __getattr__(name: str):
22
+ """Lazy load queue components."""
23
+ global _lazy_cache
24
+
25
+ if name in _lazy_cache:
26
+ return _lazy_cache[name]
27
+
28
+ if name == "QueuedRun":
29
+ from .models import QueuedRun
30
+ _lazy_cache[name] = QueuedRun
31
+ return QueuedRun
32
+ elif name == "RunState":
33
+ from .models import RunState
34
+ _lazy_cache[name] = RunState
35
+ return RunState
36
+ elif name == "RunPriority":
37
+ from .models import RunPriority
38
+ _lazy_cache[name] = RunPriority
39
+ return RunPriority
40
+ elif name == "QueueConfig":
41
+ from .models import QueueConfig
42
+ _lazy_cache[name] = QueueConfig
43
+ return QueueConfig
44
+ elif name == "QueueScheduler":
45
+ from .scheduler import QueueScheduler
46
+ _lazy_cache[name] = QueueScheduler
47
+ return QueueScheduler
48
+ elif name == "WorkerPool":
49
+ from .worker import WorkerPool
50
+ _lazy_cache[name] = WorkerPool
51
+ return WorkerPool
52
+ elif name == "QueuePersistence":
53
+ from .persistence import QueuePersistence
54
+ _lazy_cache[name] = QueuePersistence
55
+ return QueuePersistence
56
+ elif name == "QueueManager":
57
+ from .manager import QueueManager
58
+ _lazy_cache[name] = QueueManager
59
+ return QueueManager
60
+
61
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
62
+
63
+
64
+ __all__ = [
65
+ "QueuedRun",
66
+ "RunState",
67
+ "RunPriority",
68
+ "QueueConfig",
69
+ "QueueScheduler",
70
+ "WorkerPool",
71
+ "QueuePersistence",
72
+ "QueueManager",
73
+ ]