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,228 @@
1
+ """
2
+ Run command group for PraisonAI CLI.
3
+
4
+ Provides agent execution commands.
5
+ """
6
+
7
+ from typing import Optional
8
+
9
+ import typer
10
+
11
+ from ..output.console import get_output_controller
12
+ from ..state.identifiers import get_current_context
13
+
14
+ app = typer.Typer(help="Run agents")
15
+
16
+
17
+ @app.callback(invoke_without_command=True)
18
+ def run_main(
19
+ ctx: typer.Context,
20
+ target: Optional[str] = typer.Argument(None, help="Agent file or prompt"),
21
+ model: Optional[str] = typer.Option(None, "--model", "-m", help="LLM model to use"),
22
+ framework: Optional[str] = typer.Option(None, "--framework", "-f", help="Framework: praisonai, crewai, autogen"),
23
+ interactive: bool = typer.Option(False, "--interactive", "-i", help="Interactive mode"),
24
+ verbose: bool = typer.Option(False, "--verbose", "-v", help="Verbose output"),
25
+ stream: bool = typer.Option(True, "--stream/--no-stream", help="Stream output"),
26
+ trace: bool = typer.Option(False, "--trace", help="Enable tracing"),
27
+ memory: bool = typer.Option(False, "--memory", help="Enable memory"),
28
+ tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Tools file path"),
29
+ max_tokens: int = typer.Option(16000, "--max-tokens", help="Maximum output tokens"),
30
+ ):
31
+ """
32
+ Run agents from a file or prompt.
33
+
34
+ Examples:
35
+ praisonai run agents.yaml
36
+ praisonai run "What is the weather?"
37
+ praisonai run agents.yaml --interactive
38
+ """
39
+ output = get_output_controller()
40
+ context = get_current_context()
41
+
42
+ if not target:
43
+ output.print_panel(
44
+ "Run agents from a file or prompt.\n\n"
45
+ "Usage:\n"
46
+ " praisonai run agents.yaml\n"
47
+ " praisonai run \"What is the weather?\"\n"
48
+ " praisonai run agents.yaml --interactive\n\n"
49
+ "Options:\n"
50
+ " --model, -m LLM model to use\n"
51
+ " --framework, -f Framework (praisonai, crewai, autogen)\n"
52
+ " --interactive, -i Interactive mode\n"
53
+ " --verbose, -v Verbose output\n"
54
+ " --trace Enable tracing\n"
55
+ " --memory Enable memory",
56
+ title="Run Command"
57
+ )
58
+ return
59
+
60
+ # Emit start event
61
+ output.emit_start(
62
+ message=f"Starting run: {target[:50]}..." if len(target) > 50 else f"Starting run: {target}",
63
+ data={
64
+ "target": target,
65
+ "model": model,
66
+ "framework": framework,
67
+ }
68
+ )
69
+
70
+ # Check if target is a file or prompt
71
+ import os
72
+ is_file = os.path.exists(target) and (target.endswith('.yaml') or target.endswith('.yml'))
73
+
74
+ if is_file:
75
+ # Run from file
76
+ _run_from_file(
77
+ target,
78
+ model=model,
79
+ framework=framework,
80
+ interactive=interactive,
81
+ verbose=verbose,
82
+ stream=stream,
83
+ trace=trace,
84
+ memory=memory,
85
+ tools=tools,
86
+ max_tokens=max_tokens,
87
+ )
88
+ else:
89
+ # Run as prompt
90
+ _run_prompt(
91
+ target,
92
+ model=model,
93
+ verbose=verbose,
94
+ stream=stream,
95
+ trace=trace,
96
+ memory=memory,
97
+ tools=tools,
98
+ max_tokens=max_tokens,
99
+ )
100
+
101
+
102
+ def _run_from_file(
103
+ file_path: str,
104
+ model: Optional[str] = None,
105
+ framework: Optional[str] = None,
106
+ interactive: bool = False,
107
+ verbose: bool = False,
108
+ stream: bool = True,
109
+ trace: bool = False,
110
+ memory: bool = False,
111
+ tools: Optional[str] = None,
112
+ max_tokens: int = 16000,
113
+ ):
114
+ """Run agents from a YAML file."""
115
+ output = get_output_controller()
116
+
117
+ try:
118
+ # Use existing PraisonAI class
119
+ from praisonai.cli.main import PraisonAI
120
+
121
+ praison = PraisonAI(
122
+ agent_file=file_path,
123
+ framework=framework or "praisonai",
124
+ )
125
+
126
+ # Set model if provided
127
+ if model:
128
+ praison.config_list[0]['model'] = model
129
+
130
+ # Run
131
+ result = praison.run()
132
+
133
+ output.emit_result(
134
+ message="Run completed",
135
+ data={"result": str(result) if result else None}
136
+ )
137
+
138
+ if result:
139
+ if not output.is_json_mode:
140
+ output.print_success("Run completed")
141
+
142
+ except Exception as e:
143
+ output.emit_error(message=str(e))
144
+ output.print_error(str(e))
145
+ raise typer.Exit(1)
146
+
147
+
148
+ def _run_prompt(
149
+ prompt: str,
150
+ model: Optional[str] = None,
151
+ verbose: bool = False,
152
+ stream: bool = True,
153
+ trace: bool = False,
154
+ memory: bool = False,
155
+ tools: Optional[str] = None,
156
+ max_tokens: int = 16000,
157
+ ):
158
+ """Run a direct prompt."""
159
+ output = get_output_controller()
160
+
161
+ try:
162
+ # Use existing handle_direct_prompt
163
+ from praisonai.cli.main import PraisonAI
164
+
165
+ praison = PraisonAI()
166
+
167
+ if model:
168
+ praison.config_list[0]['model'] = model
169
+
170
+ # Create args-like object for handle_direct_prompt
171
+ class Args:
172
+ pass
173
+
174
+ args = Args()
175
+ args.llm = model
176
+ args.verbose = verbose
177
+ args.memory = memory
178
+ args.tools = tools
179
+ args.max_tokens = max_tokens
180
+ args.web_search = False
181
+ args.web_fetch = False
182
+ args.prompt_caching = False
183
+ args.planning = False
184
+ args.planning_tools = None
185
+ args.planning_reasoning = False
186
+ args.auto_approve_plan = False
187
+ args.final_agent = None
188
+ args.user_id = None
189
+ args.auto_save = None
190
+ args.history = None
191
+ args.include_rules = None
192
+ args.workflow = None
193
+ args.workflow_var = None
194
+ args.claude_memory = False
195
+ args.guardrail = None
196
+ args.metrics = False
197
+ args.image = None
198
+ args.image_generate = False
199
+ args.telemetry = False
200
+ args.mcp = None
201
+ args.mcp_env = None
202
+ args.fast_context = None
203
+ args.handoff = None
204
+ args.auto_memory = False
205
+ args.todo = False
206
+ args.router = False
207
+ args.router_provider = None
208
+ args.query_rewrite = False
209
+ args.rewrite_tools = None
210
+ args.expand_prompt = False
211
+ args.expand_tools = None
212
+ args.no_tools = False
213
+
214
+ praison.args = args
215
+ result = praison.handle_direct_prompt(prompt)
216
+
217
+ output.emit_result(
218
+ message="Prompt completed",
219
+ data={"result": str(result) if result else None}
220
+ )
221
+
222
+ if result and not output.is_json_mode:
223
+ print(result)
224
+
225
+ except Exception as e:
226
+ output.emit_error(message=str(e))
227
+ output.print_error(str(e))
228
+ raise typer.Exit(1)
@@ -0,0 +1,150 @@
1
+ """
2
+ Schedule command group for PraisonAI CLI.
3
+
4
+ Provides scheduler management.
5
+ """
6
+
7
+ from typing import Optional
8
+
9
+ import typer
10
+
11
+ from ..output.console import get_output_controller
12
+
13
+ app = typer.Typer(help="Scheduler management")
14
+
15
+
16
+ def _run_schedule(args: list) -> int:
17
+ """Run schedule command with args."""
18
+ try:
19
+ from ..features.agent_scheduler import AgentSchedulerHandler
20
+
21
+ # Parse subcommand
22
+ if args and args[0] in ['start', 'list', 'stop', 'logs', 'restart', 'delete', 'describe', 'save', 'stop-all', 'stats']:
23
+ subcommand = args[0]
24
+ remaining = args[1:] if len(args) > 1 else []
25
+
26
+ # Create minimal args namespace
27
+ class Args:
28
+ pass
29
+
30
+ fake_args = Args()
31
+ return AgentSchedulerHandler.handle_daemon_command(subcommand, fake_args, remaining)
32
+
33
+ return 0
34
+ except ImportError as e:
35
+ output = get_output_controller()
36
+ output.print_error(f"Scheduler module not available: {e}")
37
+ return 4
38
+
39
+
40
+ @app.command("start")
41
+ def schedule_start(
42
+ agents_file: str = typer.Argument("agents.yaml", help="Agents YAML file"),
43
+ interval: Optional[str] = typer.Option(None, "--interval", "-i", help="Schedule interval (e.g., 'hourly', '*/30m')"),
44
+ daemon: bool = typer.Option(True, "--daemon/--no-daemon", help="Run as daemon"),
45
+ name: Optional[str] = typer.Option(None, "--name", "-n", help="Job name"),
46
+ ):
47
+ """Start scheduled agent execution."""
48
+ args = ["start", agents_file]
49
+ if interval:
50
+ args.extend(["--interval", interval])
51
+ if not daemon:
52
+ args.append("--no-daemon")
53
+ if name:
54
+ args.extend(["--name", name])
55
+
56
+ raise typer.Exit(_run_schedule(args))
57
+
58
+
59
+ @app.command("stop")
60
+ def schedule_stop(
61
+ job_id: Optional[str] = typer.Argument(None, help="Job ID to stop (or 'all')"),
62
+ ):
63
+ """Stop scheduled job(s)."""
64
+ if job_id == "all":
65
+ raise typer.Exit(_run_schedule(["stop-all"]))
66
+ elif job_id:
67
+ raise typer.Exit(_run_schedule(["stop", job_id]))
68
+ else:
69
+ raise typer.Exit(_run_schedule(["stop"]))
70
+
71
+
72
+ @app.command("list")
73
+ def schedule_list(
74
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
75
+ ):
76
+ """List scheduled jobs."""
77
+ args = ["list"]
78
+ if json_output:
79
+ args.append("--json")
80
+ raise typer.Exit(_run_schedule(args))
81
+
82
+
83
+ @app.command("logs")
84
+ def schedule_logs(
85
+ job_id: Optional[str] = typer.Argument(None, help="Job ID"),
86
+ tail: int = typer.Option(50, "--tail", "-n", help="Number of lines"),
87
+ follow: bool = typer.Option(False, "--follow", "-f", help="Follow log output"),
88
+ ):
89
+ """View scheduler logs."""
90
+ args = ["logs"]
91
+ if job_id:
92
+ args.append(job_id)
93
+ args.extend(["--tail", str(tail)])
94
+ if follow:
95
+ args.append("--follow")
96
+ raise typer.Exit(_run_schedule(args))
97
+
98
+
99
+ @app.command("restart")
100
+ def schedule_restart(
101
+ job_id: str = typer.Argument(..., help="Job ID to restart"),
102
+ ):
103
+ """Restart a scheduled job."""
104
+ raise typer.Exit(_run_schedule(["restart", job_id]))
105
+
106
+
107
+ @app.command("delete")
108
+ def schedule_delete(
109
+ job_id: str = typer.Argument(..., help="Job ID to delete"),
110
+ confirm: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
111
+ ):
112
+ """Delete a scheduled job."""
113
+ if not confirm:
114
+ confirmed = typer.confirm(f"Delete job {job_id}?")
115
+ if not confirmed:
116
+ output = get_output_controller()
117
+ output.print_info("Cancelled")
118
+ raise typer.Exit(0)
119
+
120
+ raise typer.Exit(_run_schedule(["delete", job_id]))
121
+
122
+
123
+ @app.command("describe")
124
+ def schedule_describe(
125
+ job_id: str = typer.Argument(..., help="Job ID"),
126
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
127
+ ):
128
+ """Show job details."""
129
+ args = ["describe", job_id]
130
+ if json_output:
131
+ args.append("--json")
132
+ raise typer.Exit(_run_schedule(args))
133
+
134
+
135
+ @app.command("stats")
136
+ def schedule_stats(
137
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
138
+ ):
139
+ """Show scheduler statistics."""
140
+ args = ["stats"]
141
+ if json_output:
142
+ args.append("--json")
143
+ raise typer.Exit(_run_schedule(args))
144
+
145
+
146
+ @app.callback(invoke_without_command=True)
147
+ def schedule_callback(ctx: typer.Context):
148
+ """Show schedule help or list jobs."""
149
+ if ctx.invoked_subcommand is None:
150
+ schedule_list(json_output=False)
@@ -0,0 +1,97 @@
1
+ """
2
+ Serve command group for PraisonAI CLI.
3
+
4
+ Provides API server management.
5
+ """
6
+
7
+ from typing import Optional
8
+
9
+ import typer
10
+
11
+ from ..output.console import get_output_controller
12
+
13
+ app = typer.Typer(help="API server management")
14
+
15
+
16
+ @app.command("start")
17
+ def serve_start(
18
+ host: str = typer.Option("0.0.0.0", "--host", "-h", help="Host to bind to"),
19
+ port: int = typer.Option(8000, "--port", "-p", help="Port to bind to"),
20
+ agents_file: Optional[str] = typer.Option(None, "--agents", "-a", help="Agents YAML file"),
21
+ reload: bool = typer.Option(False, "--reload", help="Enable auto-reload"),
22
+ workers: int = typer.Option(1, "--workers", "-w", help="Number of workers"),
23
+ ):
24
+ """Start API server."""
25
+ output = get_output_controller()
26
+
27
+ # Build args for existing handler
28
+ args = [
29
+ "start",
30
+ "--host", host,
31
+ "--port", str(port),
32
+ "--workers", str(workers),
33
+ ]
34
+
35
+ if agents_file:
36
+ args.extend(["--agents", agents_file])
37
+ if reload:
38
+ args.append("--reload")
39
+
40
+ try:
41
+ from ..features.serve import handle_serve_command
42
+ exit_code = handle_serve_command(args)
43
+ raise typer.Exit(exit_code)
44
+ except ImportError as e:
45
+ output.print_error(f"Serve module not available: {e}")
46
+ raise typer.Exit(4)
47
+
48
+
49
+ @app.command("stop")
50
+ def serve_stop():
51
+ """Stop API server."""
52
+ output = get_output_controller()
53
+
54
+ try:
55
+ from ..features.serve import handle_serve_command
56
+ exit_code = handle_serve_command(["stop"])
57
+ raise typer.Exit(exit_code)
58
+ except ImportError as e:
59
+ output.print_error(f"Serve module not available: {e}")
60
+ raise typer.Exit(4)
61
+
62
+
63
+ @app.command("status")
64
+ def serve_status(
65
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
66
+ ):
67
+ """Show server status."""
68
+ output = get_output_controller()
69
+
70
+ args = ["status"]
71
+ if json_output:
72
+ args.append("--json")
73
+
74
+ try:
75
+ from ..features.serve import handle_serve_command
76
+ exit_code = handle_serve_command(args)
77
+ raise typer.Exit(exit_code)
78
+ except ImportError as e:
79
+ output.print_error(f"Serve module not available: {e}")
80
+ raise typer.Exit(4)
81
+
82
+
83
+ @app.callback(invoke_without_command=True)
84
+ def serve_callback(ctx: typer.Context):
85
+ """Show serve help or start server."""
86
+ if ctx.invoked_subcommand is None:
87
+ output = get_output_controller()
88
+ output.print_panel(
89
+ "API server management.\n\n"
90
+ "Commands:\n"
91
+ " start Start API server\n"
92
+ " stop Stop API server\n"
93
+ " status Show server status\n\n"
94
+ "Quick start:\n"
95
+ " praisonai serve start --agents agents.yaml",
96
+ title="Serve Commands"
97
+ )
@@ -0,0 +1,212 @@
1
+ """
2
+ Session command group for PraisonAI CLI.
3
+
4
+ Provides session management:
5
+ - session list: List all sessions
6
+ - session resume: Resume a session
7
+ - session delete: Delete a session
8
+ - session export: Export a session
9
+ """
10
+
11
+ from typing import Optional
12
+
13
+ import typer
14
+
15
+ from ..output.console import get_output_controller
16
+ from ..state.sessions import get_session_manager
17
+
18
+ app = typer.Typer(help="Session management")
19
+
20
+
21
+ @app.command("list")
22
+ def session_list(
23
+ limit: int = typer.Option(
24
+ 20,
25
+ "--limit",
26
+ "-n",
27
+ help="Maximum number of sessions to show",
28
+ ),
29
+ ):
30
+ """List all sessions."""
31
+ output = get_output_controller()
32
+ manager = get_session_manager()
33
+
34
+ sessions = manager.list(limit=limit)
35
+
36
+ if output.is_json_mode:
37
+ output.print_json({
38
+ "sessions": [s.to_dict() for s in sessions]
39
+ })
40
+ return
41
+
42
+ if not sessions:
43
+ output.print_info("No sessions found")
44
+ return
45
+
46
+ headers = ["ID", "Name", "Status", "Events", "Updated"]
47
+ rows = []
48
+ for s in sessions:
49
+ rows.append([
50
+ s.session_id[:20] + "..." if len(s.session_id) > 20 else s.session_id,
51
+ s.name or "-",
52
+ s.status,
53
+ str(s.event_count),
54
+ s.updated_at.strftime("%Y-%m-%d %H:%M"),
55
+ ])
56
+
57
+ output.print_table(headers, rows, title="Sessions")
58
+
59
+
60
+ @app.command("resume")
61
+ def session_resume(
62
+ session_id: str = typer.Argument(..., help="Session ID to resume"),
63
+ ):
64
+ """Resume a session."""
65
+ output = get_output_controller()
66
+ manager = get_session_manager()
67
+
68
+ session = manager.get(session_id)
69
+
70
+ if not session:
71
+ output.print_error(
72
+ f"Session not found: {session_id}",
73
+ remediation="Use 'praisonai session list' to see available sessions"
74
+ )
75
+ raise typer.Exit(1)
76
+
77
+ # Load session events
78
+ events = manager.get_events(session_id)
79
+
80
+ if output.is_json_mode:
81
+ output.print_json({
82
+ "session": session.to_dict(),
83
+ "events": events,
84
+ "message": "Session loaded. True resume not supported - showing transcript.",
85
+ })
86
+ return
87
+
88
+ output.print_panel(
89
+ f"Session: {session.name or session.session_id}\n"
90
+ f"Run ID: {session.run_id}\n"
91
+ f"Trace ID: {session.trace_id}\n"
92
+ f"Events: {session.event_count}\n"
93
+ f"Status: {session.status}",
94
+ title="Session Loaded"
95
+ )
96
+
97
+ output.print_warning(
98
+ "True session resume is not yet supported. "
99
+ "Showing session transcript instead."
100
+ )
101
+
102
+ # Show recent events
103
+ if events:
104
+ output.print("\n--- Recent Events ---\n")
105
+ for event in events[-10:]:
106
+ event_type = event.get("event", "unknown")
107
+ message = event.get("message", "")
108
+ output.print(f"[{event_type}] {message}")
109
+
110
+
111
+ @app.command("delete")
112
+ def session_delete(
113
+ session_id: str = typer.Argument(..., help="Session ID to delete"),
114
+ confirm: bool = typer.Option(
115
+ False,
116
+ "--yes",
117
+ "-y",
118
+ help="Skip confirmation",
119
+ ),
120
+ ):
121
+ """Delete a session."""
122
+ output = get_output_controller()
123
+ manager = get_session_manager()
124
+
125
+ session = manager.get(session_id)
126
+
127
+ if not session:
128
+ output.print_error(f"Session not found: {session_id}")
129
+ raise typer.Exit(1)
130
+
131
+ if not confirm:
132
+ confirmed = typer.confirm(f"Delete session {session_id}?")
133
+ if not confirmed:
134
+ output.print_info("Cancelled")
135
+ raise typer.Exit(0)
136
+
137
+ deleted = manager.delete(session_id)
138
+
139
+ if output.is_json_mode:
140
+ output.print_json({"deleted": deleted, "session_id": session_id})
141
+ else:
142
+ if deleted:
143
+ output.print_success(f"Deleted session: {session_id}")
144
+ else:
145
+ output.print_error(f"Failed to delete session: {session_id}")
146
+ raise typer.Exit(1)
147
+
148
+
149
+ @app.command("export")
150
+ def session_export(
151
+ session_id: str = typer.Argument(..., help="Session ID to export"),
152
+ format: str = typer.Option(
153
+ "md",
154
+ "--format",
155
+ "-f",
156
+ help="Export format: md or json",
157
+ ),
158
+ output_file: Optional[str] = typer.Option(
159
+ None,
160
+ "--output",
161
+ "-o",
162
+ help="Output file path",
163
+ ),
164
+ ):
165
+ """Export a session."""
166
+ output = get_output_controller()
167
+ manager = get_session_manager()
168
+
169
+ content = manager.export(session_id, format=format)
170
+
171
+ if content is None:
172
+ output.print_error(f"Session not found: {session_id}")
173
+ raise typer.Exit(1)
174
+
175
+ if output_file:
176
+ with open(output_file, "w", encoding="utf-8") as f:
177
+ f.write(content)
178
+ output.print_success(f"Exported to: {output_file}")
179
+ else:
180
+ print(content)
181
+
182
+
183
+ @app.command("show")
184
+ def session_show(
185
+ session_id: str = typer.Argument(..., help="Session ID to show"),
186
+ ):
187
+ """Show session details."""
188
+ output = get_output_controller()
189
+ manager = get_session_manager()
190
+
191
+ session = manager.get(session_id)
192
+
193
+ if not session:
194
+ output.print_error(f"Session not found: {session_id}")
195
+ raise typer.Exit(1)
196
+
197
+ if output.is_json_mode:
198
+ output.print_json(session.to_dict())
199
+ return
200
+
201
+ output.print_panel(
202
+ f"Session ID: {session.session_id}\n"
203
+ f"Name: {session.name or '-'}\n"
204
+ f"Run ID: {session.run_id}\n"
205
+ f"Trace ID: {session.trace_id}\n"
206
+ f"Created: {session.created_at.isoformat()}\n"
207
+ f"Updated: {session.updated_at.isoformat()}\n"
208
+ f"Status: {session.status}\n"
209
+ f"Events: {session.event_count}\n"
210
+ f"Workspace: {session.workspace or '-'}",
211
+ title="Session Details"
212
+ )