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,517 @@
1
+ """
2
+ CLI handler for deploy commands.
3
+ """
4
+ import json
5
+ import sys
6
+ from rich.console import Console
7
+ from rich.table import Table
8
+ from rich.panel import Panel
9
+ from rich import print as rprint
10
+
11
+
12
+ console = Console()
13
+
14
+
15
+ class DeployHandler:
16
+ """Handler for deploy CLI commands."""
17
+
18
+ def handle_deploy(self, args):
19
+ """
20
+ Handle deploy command.
21
+
22
+ Args:
23
+ args: Parsed command-line arguments
24
+ """
25
+ try:
26
+ from praisonai.deploy import Deploy, DeployConfig, DeployType, CloudProvider
27
+ from praisonai.deploy.models import APIConfig, DockerConfig, CloudConfig
28
+
29
+ # Determine if loading from YAML or using explicit flags
30
+ if args.type:
31
+ # Explicit type specified via CLI flags
32
+ deploy_type = DeployType(args.type)
33
+
34
+ if deploy_type == DeployType.API:
35
+ config = DeployConfig(
36
+ type=deploy_type,
37
+ api=APIConfig(
38
+ host=getattr(args, 'host', '127.0.0.1'),
39
+ port=getattr(args, 'port', 8005),
40
+ workers=getattr(args, 'workers', 1)
41
+ )
42
+ )
43
+ elif deploy_type == DeployType.DOCKER:
44
+ config = DeployConfig(
45
+ type=deploy_type,
46
+ docker=DockerConfig(
47
+ image_name=getattr(args, 'image_name', 'praisonai-app'),
48
+ tag=getattr(args, 'tag', 'latest'),
49
+ push=getattr(args, 'push', False),
50
+ registry=getattr(args, 'registry', None)
51
+ )
52
+ )
53
+ elif deploy_type == DeployType.CLOUD:
54
+ provider = CloudProvider(args.provider)
55
+ config = DeployConfig(
56
+ type=deploy_type,
57
+ cloud=CloudConfig(
58
+ provider=provider,
59
+ region=getattr(args, 'region', 'us-east-1'),
60
+ service_name=getattr(args, 'service_name', 'praisonai-service'),
61
+ project_id=getattr(args, 'project_id', None),
62
+ resource_group=getattr(args, 'resource_group', None),
63
+ subscription_id=getattr(args, 'subscription_id', None)
64
+ )
65
+ )
66
+
67
+ deploy = Deploy(config, args.file)
68
+ else:
69
+ # Load from YAML
70
+ deploy = Deploy.from_yaml(args.file)
71
+
72
+ # Execute deployment
73
+ console.print(f"\n[bold blue]🚀 Starting deployment...[/bold blue]\n")
74
+
75
+ background = getattr(args, 'background', False)
76
+ result = deploy.deploy(background=background)
77
+
78
+ if args.json:
79
+ self._print_json({
80
+ "success": result.success,
81
+ "message": result.message,
82
+ "url": result.url,
83
+ "error": result.error,
84
+ "metadata": result.metadata
85
+ })
86
+ else:
87
+ if result.success:
88
+ console.print(f"\n[bold green]✅ {result.message}[/bold green]")
89
+ if result.url:
90
+ console.print(f"[bold cyan]🔗 URL:[/bold cyan] {result.url}")
91
+ if result.metadata:
92
+ console.print(f"\n[bold]Metadata:[/bold]")
93
+ for key, value in result.metadata.items():
94
+ console.print(f" • {key}: {value}")
95
+ else:
96
+ console.print(f"\n[bold red]❌ {result.message}[/bold red]")
97
+ if result.error:
98
+ console.print(f"[red]Error: {result.error}[/red]")
99
+ sys.exit(1)
100
+
101
+ except Exception as e:
102
+ if getattr(args, 'json', False):
103
+ self._print_json({"success": False, "error": str(e)})
104
+ else:
105
+ console.print(f"[bold red]❌ Deployment failed: {e}[/bold red]")
106
+ sys.exit(1)
107
+
108
+ def handle_doctor(self, args):
109
+ """
110
+ Handle deploy doctor command.
111
+
112
+ Args:
113
+ args: Parsed command-line arguments
114
+ """
115
+ try:
116
+ from praisonai.deploy.doctor import (
117
+ run_all_checks, run_local_checks,
118
+ run_aws_checks, run_azure_checks, run_gcp_checks
119
+ )
120
+
121
+ console.print("\n[bold blue]🏥 Running deployment health checks...[/bold blue]\n")
122
+
123
+ # Determine which checks to run
124
+ if args.all:
125
+ report = run_all_checks(args.file)
126
+ elif args.provider:
127
+ if args.provider == 'aws':
128
+ report = run_aws_checks()
129
+ elif args.provider == 'azure':
130
+ report = run_azure_checks()
131
+ elif args.provider == 'gcp':
132
+ report = run_gcp_checks()
133
+ else:
134
+ console.print(f"[red]Unknown provider: {args.provider}[/red]")
135
+ sys.exit(1)
136
+ else:
137
+ report = run_local_checks(agents_file=args.file)
138
+
139
+ if args.json:
140
+ self._print_json({
141
+ "total_checks": report.total_checks,
142
+ "passed": report.passed_checks,
143
+ "failed": report.failed_checks,
144
+ "all_passed": report.all_passed,
145
+ "checks": [
146
+ {
147
+ "name": c.name,
148
+ "passed": c.passed,
149
+ "message": c.message,
150
+ "fix_suggestion": c.fix_suggestion
151
+ }
152
+ for c in report.checks
153
+ ]
154
+ })
155
+ else:
156
+ # Create results table
157
+ table = Table(title="Health Check Results")
158
+ table.add_column("Check", style="cyan")
159
+ table.add_column("Status", style="bold")
160
+ table.add_column("Message")
161
+
162
+ for check in report.checks:
163
+ status = "[green]✅ PASS[/green]" if check.passed else "[red]❌ FAIL[/red]"
164
+ table.add_row(check.name, status, check.message)
165
+
166
+ console.print(table)
167
+
168
+ # Summary
169
+ console.print(f"\n[bold]Summary:[/bold]")
170
+ console.print(f" Total checks: {report.total_checks}")
171
+ console.print(f" Passed: [green]{report.passed_checks}[/green]")
172
+ console.print(f" Failed: [red]{report.failed_checks}[/red]")
173
+
174
+ # Show fix suggestions for failed checks
175
+ failed_checks = [c for c in report.checks if not c.passed and c.fix_suggestion]
176
+ if failed_checks:
177
+ console.print(f"\n[bold yellow]💡 Fix Suggestions:[/bold yellow]")
178
+ for check in failed_checks:
179
+ console.print(f"\n[bold]{check.name}:[/bold]")
180
+ console.print(f" {check.fix_suggestion}")
181
+
182
+ if not report.all_passed:
183
+ sys.exit(1)
184
+
185
+ except Exception as e:
186
+ if getattr(args, 'json', False):
187
+ self._print_json({"error": str(e)})
188
+ else:
189
+ console.print(f"[bold red]❌ Doctor check failed: {e}[/bold red]")
190
+ sys.exit(1)
191
+
192
+ def handle_init(self, args):
193
+ """
194
+ Handle deploy init command - generate sample agents.yaml.
195
+
196
+ Args:
197
+ args: Parsed command-line arguments
198
+ """
199
+ try:
200
+ from praisonai.deploy.schema import save_sample_yaml
201
+ from praisonai.deploy.models import DeployType, CloudProvider
202
+
203
+ deploy_type = DeployType(args.type) if args.type else DeployType.API
204
+ provider = CloudProvider(args.provider) if hasattr(args, 'provider') and args.provider else None
205
+
206
+ console.print(f"\n[bold blue]📝 Generating sample agents.yaml...[/bold blue]\n")
207
+
208
+ save_sample_yaml(args.file, deploy_type, provider)
209
+
210
+ console.print(f"[bold green]✅ Created {args.file}[/bold green]")
211
+ console.print(f"\n[bold]Next steps:[/bold]")
212
+ console.print(f" 1. Edit {args.file} to configure your agents")
213
+ console.print(f" 2. Run: praisonai deploy validate --file {args.file}")
214
+ console.print(f" 3. Run: praisonai deploy --file {args.file}")
215
+
216
+ except Exception as e:
217
+ console.print(f"[bold red]❌ Failed to create sample YAML: {e}[/bold red]")
218
+ sys.exit(1)
219
+
220
+ def handle_validate(self, args):
221
+ """
222
+ Handle deploy validate command.
223
+
224
+ Args:
225
+ args: Parsed command-line arguments
226
+ """
227
+ try:
228
+ from praisonai.deploy.schema import validate_agents_yaml
229
+
230
+ console.print(f"\n[bold blue]🔍 Validating {args.file}...[/bold blue]\n")
231
+
232
+ config = validate_agents_yaml(args.file)
233
+
234
+ if config is None:
235
+ if args.json:
236
+ self._print_json({"valid": False, "error": "No deploy section found"})
237
+ else:
238
+ console.print("[yellow]⚠️ No deploy configuration found in agents.yaml[/yellow]")
239
+ console.print("\nRun: praisonai deploy init --file agents.yaml")
240
+ sys.exit(1)
241
+
242
+ if args.json:
243
+ self._print_json({
244
+ "valid": True,
245
+ "type": config.type.value,
246
+ "config": config.model_dump()
247
+ })
248
+ else:
249
+ console.print("[bold green]✅ Configuration is valid![/bold green]")
250
+ console.print(f"\n[bold]Deploy Type:[/bold] {config.type.value}")
251
+
252
+ if config.type.value == "api":
253
+ console.print(f" Host: {config.api.host}")
254
+ console.print(f" Port: {config.api.port}")
255
+ console.print(f" Workers: {config.api.workers}")
256
+ elif config.type.value == "docker":
257
+ console.print(f" Image: {config.docker.image_name}:{config.docker.tag}")
258
+ console.print(f" Ports: {config.docker.expose}")
259
+ elif config.type.value == "cloud":
260
+ console.print(f" Provider: {config.cloud.provider.value}")
261
+ console.print(f" Region: {config.cloud.region}")
262
+ console.print(f" Service: {config.cloud.service_name}")
263
+
264
+ except ValueError as e:
265
+ if args.json:
266
+ self._print_json({"valid": False, "error": str(e)})
267
+ else:
268
+ console.print(f"[bold red]❌ Validation failed: {e}[/bold red]")
269
+ sys.exit(1)
270
+ except Exception as e:
271
+ if args.json:
272
+ self._print_json({"valid": False, "error": str(e)})
273
+ else:
274
+ console.print(f"[bold red]❌ Error: {e}[/bold red]")
275
+ sys.exit(1)
276
+
277
+ def handle_plan(self, args):
278
+ """
279
+ Handle deploy plan command - show deployment plan without executing.
280
+
281
+ Args:
282
+ args: Parsed command-line arguments
283
+ """
284
+ try:
285
+ from praisonai.deploy import Deploy
286
+
287
+ console.print(f"\n[bold blue]📋 Generating deployment plan...[/bold blue]\n")
288
+
289
+ deploy = Deploy.from_yaml(args.file)
290
+ plan = deploy.plan()
291
+
292
+ if args.json:
293
+ self._print_json(plan)
294
+ else:
295
+ console.print(Panel.fit(
296
+ self._format_plan(plan),
297
+ title="[bold]Deployment Plan[/bold]",
298
+ border_style="blue"
299
+ ))
300
+
301
+ console.print("\n[bold]To execute this plan, run:[/bold]")
302
+ console.print(f" praisonai deploy --file {args.file}")
303
+
304
+ except Exception as e:
305
+ if args.json:
306
+ self._print_json({"error": str(e)})
307
+ else:
308
+ console.print(f"[bold red]❌ Failed to generate plan: {e}[/bold red]")
309
+ sys.exit(1)
310
+
311
+ def _format_plan(self, plan: dict) -> str:
312
+ """Format plan dictionary as readable text."""
313
+ lines = []
314
+ for key, value in plan.items():
315
+ if key == "steps" and isinstance(value, list):
316
+ lines.append(f"\n[bold]Steps:[/bold]")
317
+ for step in value:
318
+ lines.append(f" {step}")
319
+ elif isinstance(value, dict):
320
+ lines.append(f"\n[bold]{key}:[/bold]")
321
+ for k, v in value.items():
322
+ lines.append(f" {k}: {v}")
323
+ else:
324
+ lines.append(f"[bold]{key}:[/bold] {value}")
325
+ return "\n".join(lines)
326
+
327
+ def handle_status(self, args):
328
+ """
329
+ Handle deploy status command - show current deployment status.
330
+
331
+ Args:
332
+ args: Parsed command-line arguments
333
+ """
334
+ try:
335
+ from praisonai.deploy import Deploy
336
+
337
+ console.print(f"\n[bold blue]📊 Checking deployment status...[/bold blue]\n")
338
+
339
+ deploy = Deploy.from_yaml(args.file)
340
+ status = deploy.status()
341
+
342
+ if args.json:
343
+ self._print_json(status.to_dict())
344
+ else:
345
+ # Create status table
346
+ table = Table(title="Deployment Status")
347
+ table.add_column("Property", style="cyan")
348
+ table.add_column("Value", style="bold")
349
+
350
+ # State with color
351
+ state_color = {
352
+ "running": "green",
353
+ "stopped": "yellow",
354
+ "pending": "blue",
355
+ "failed": "red",
356
+ "not_found": "dim",
357
+ "unknown": "dim"
358
+ }.get(status.state.value, "white")
359
+
360
+ table.add_row("State", f"[{state_color}]{status.state.value.upper()}[/{state_color}]")
361
+ table.add_row("Service Name", status.service_name or "N/A")
362
+ table.add_row("Provider", status.provider or "N/A")
363
+ table.add_row("Region", status.region or "N/A")
364
+
365
+ if status.url:
366
+ table.add_row("URL", f"[cyan]{status.url}[/cyan]")
367
+
368
+ table.add_row("Healthy", "✅ Yes" if status.healthy else "❌ No")
369
+ table.add_row("Instances", f"{status.instances_running}/{status.instances_desired}")
370
+
371
+ if status.created_at:
372
+ table.add_row("Created", status.created_at)
373
+ if status.updated_at:
374
+ table.add_row("Updated", status.updated_at)
375
+
376
+ console.print(table)
377
+
378
+ if status.message:
379
+ console.print(f"\n[bold]Message:[/bold] {status.message}")
380
+
381
+ # Show metadata if verbose
382
+ if getattr(args, 'verbose', False) and status.metadata:
383
+ console.print(f"\n[bold]Metadata:[/bold]")
384
+ for key, value in status.metadata.items():
385
+ console.print(f" • {key}: {value}")
386
+
387
+ except Exception as e:
388
+ if getattr(args, 'json', False):
389
+ self._print_json({"error": str(e)})
390
+ else:
391
+ console.print(f"[bold red]❌ Failed to get status: {e}[/bold red]")
392
+ sys.exit(1)
393
+
394
+ def handle_destroy(self, args):
395
+ """
396
+ Handle deploy destroy command - destroy/delete deployment.
397
+
398
+ Args:
399
+ args: Parsed command-line arguments
400
+ """
401
+ try:
402
+ from praisonai.deploy import Deploy
403
+
404
+ deploy = Deploy.from_yaml(args.file)
405
+
406
+ # Confirmation check unless --yes is provided
407
+ if not args.yes:
408
+ console.print(f"\n[bold yellow]⚠️ Warning: This will destroy the deployment![/bold yellow]")
409
+ console.print(f"[bold]File:[/bold] {args.file}")
410
+
411
+ # Show what will be destroyed
412
+ status = deploy.status()
413
+ if status.service_name:
414
+ console.print(f"[bold]Service:[/bold] {status.service_name}")
415
+ if status.provider:
416
+ console.print(f"[bold]Provider:[/bold] {status.provider}")
417
+
418
+ confirm = input("\nType 'yes' to confirm destruction: ")
419
+ if confirm.lower() != 'yes':
420
+ console.print("[yellow]Destruction cancelled.[/yellow]")
421
+ return
422
+
423
+ console.print(f"\n[bold red]🗑️ Destroying deployment...[/bold red]\n")
424
+
425
+ force = getattr(args, 'force', False)
426
+ result = deploy.destroy(force=force)
427
+
428
+ if args.json:
429
+ self._print_json({
430
+ "success": result.success,
431
+ "message": result.message,
432
+ "resources_deleted": result.resources_deleted,
433
+ "error": result.error,
434
+ "metadata": result.metadata
435
+ })
436
+ else:
437
+ if result.success:
438
+ console.print(f"[bold green]✅ {result.message}[/bold green]")
439
+ if result.resources_deleted:
440
+ console.print(f"\n[bold]Deleted resources:[/bold]")
441
+ for resource in result.resources_deleted:
442
+ console.print(f" • {resource}")
443
+ else:
444
+ console.print(f"[bold red]❌ {result.message}[/bold red]")
445
+ if result.error:
446
+ console.print(f"[red]Error: {result.error}[/red]")
447
+ sys.exit(1)
448
+
449
+ except Exception as e:
450
+ if getattr(args, 'json', False):
451
+ self._print_json({"success": False, "error": str(e)})
452
+ else:
453
+ console.print(f"[bold red]❌ Destruction failed: {e}[/bold red]")
454
+ sys.exit(1)
455
+
456
+ def _print_json(self, data: dict):
457
+ """Print data as JSON."""
458
+ print(json.dumps(data, indent=2))
459
+
460
+
461
+ def add_deploy_subcommands(subparsers):
462
+ """
463
+ Add deploy subcommands to CLI parser.
464
+
465
+ Args:
466
+ subparsers: Subparsers from argparse
467
+ """
468
+ # Main deploy command
469
+ deploy_parser = subparsers.add_parser('deploy', help='Deploy agents')
470
+ deploy_subparsers = deploy_parser.add_subparsers(dest='deploy_command')
471
+
472
+ # deploy (main deployment)
473
+ deploy_main = deploy_subparsers.add_parser('run', help='Deploy agents')
474
+ deploy_main.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
475
+ deploy_main.add_argument('--type', choices=['api', 'docker', 'cloud'], help='Deployment type')
476
+ deploy_main.add_argument('--provider', choices=['aws', 'azure', 'gcp'], help='Cloud provider (for cloud type)')
477
+ deploy_main.add_argument('--background', action='store_true', help='Run in background (API only)')
478
+ deploy_main.add_argument('--json', action='store_true', help='Output as JSON')
479
+
480
+ # deploy doctor
481
+ doctor_parser = deploy_subparsers.add_parser('doctor', help='Check deployment readiness')
482
+ doctor_parser.add_argument('--file', '-f', help='Path to agents.yaml')
483
+ doctor_parser.add_argument('--provider', choices=['aws', 'azure', 'gcp'], help='Check specific provider')
484
+ doctor_parser.add_argument('--all', action='store_true', help='Run all checks')
485
+ doctor_parser.add_argument('--verbose', action='store_true', help='Verbose output')
486
+ doctor_parser.add_argument('--json', action='store_true', help='Output as JSON')
487
+
488
+ # deploy init
489
+ init_parser = deploy_subparsers.add_parser('init', help='Generate sample agents.yaml')
490
+ init_parser.add_argument('--file', '-f', default='agents.yaml', help='Output file path')
491
+ init_parser.add_argument('--type', choices=['api', 'docker', 'cloud'], default='api', help='Deployment type')
492
+ init_parser.add_argument('--provider', choices=['aws', 'azure', 'gcp'], help='Cloud provider (for cloud type)')
493
+
494
+ # deploy validate
495
+ validate_parser = deploy_subparsers.add_parser('validate', help='Validate agents.yaml deploy config')
496
+ validate_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
497
+ validate_parser.add_argument('--json', action='store_true', help='Output as JSON')
498
+
499
+ # deploy plan
500
+ plan_parser = deploy_subparsers.add_parser('plan', help='Show deployment plan')
501
+ plan_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
502
+ plan_parser.add_argument('--json', action='store_true', help='Output as JSON')
503
+
504
+ # deploy status
505
+ status_parser = deploy_subparsers.add_parser('status', help='Show deployment status')
506
+ status_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
507
+ status_parser.add_argument('--json', action='store_true', help='Output as JSON')
508
+ status_parser.add_argument('--verbose', '-v', action='store_true', help='Show detailed metadata')
509
+
510
+ # deploy destroy
511
+ destroy_parser = deploy_subparsers.add_parser('destroy', help='Destroy/delete deployment')
512
+ destroy_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
513
+ destroy_parser.add_argument('--yes', '-y', action='store_true', help='Skip confirmation prompt')
514
+ destroy_parser.add_argument('--force', action='store_true', help='Force deletion and remove all related resources')
515
+ destroy_parser.add_argument('--json', action='store_true', help='Output as JSON')
516
+
517
+ return deploy_parser