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
praisonai/scheduler.py ADDED
@@ -0,0 +1,194 @@
1
+ """
2
+ DEPRECATED: This module is deprecated. Use praisonai.scheduler instead.
3
+
4
+ This file is kept for backward compatibility only.
5
+ All new code should import from praisonai.scheduler.
6
+ """
7
+
8
+ import warnings
9
+ import logging
10
+ import threading
11
+ import time
12
+ from typing import Optional, Dict, Any
13
+ from abc import ABC, abstractmethod
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ # Issue deprecation warning
18
+ warnings.warn(
19
+ "praisonai.scheduler module (root level) is deprecated. "
20
+ "Use 'from praisonai.scheduler import ...' instead.",
21
+ DeprecationWarning,
22
+ stacklevel=2
23
+ )
24
+
25
+ # Import from new scheduler module for backward compatibility
26
+ from .scheduler.base import ScheduleParser
27
+
28
+ # Keep old classes for backward compatibility
29
+ class DeployerInterface(ABC):
30
+ """Abstract interface for deployers to ensure provider compatibility."""
31
+
32
+ @abstractmethod
33
+ def deploy(self) -> bool:
34
+ """Execute deployment. Returns True on success, False on failure."""
35
+ pass
36
+
37
+ class CloudDeployerAdapter(DeployerInterface):
38
+ """Adapter for existing CloudDeployer to match interface."""
39
+
40
+ def __init__(self):
41
+ from .deploy import CloudDeployer
42
+ self._deployer = CloudDeployer()
43
+
44
+ def deploy(self) -> bool:
45
+ """Execute deployment using CloudDeployer."""
46
+ try:
47
+ self._deployer.run_commands()
48
+ return True
49
+ except Exception as e:
50
+ logger.error(f"Deployment failed: {e}")
51
+ return False
52
+
53
+ class DeploymentScheduler:
54
+ """
55
+ Minimal deployment scheduler with provider-agnostic design.
56
+
57
+ Features:
58
+ - Simple interval-based scheduling
59
+ - Thread-safe operation
60
+ - Extensible deployer factory pattern
61
+ - Minimal dependencies
62
+ """
63
+
64
+ def __init__(self, schedule_config: Optional[Dict[str, Any]] = None):
65
+ self.config = schedule_config or {}
66
+ self.is_running = False
67
+ self._stop_event = threading.Event()
68
+ self._thread = None
69
+ self._deployer = None
70
+
71
+ def set_deployer(self, deployer: DeployerInterface):
72
+ """Set custom deployer implementation."""
73
+ self._deployer = deployer
74
+
75
+ def _get_deployer(self) -> DeployerInterface:
76
+ """Get deployer instance using factory pattern."""
77
+ if self._deployer:
78
+ return self._deployer
79
+
80
+ # Default to CloudDeployer for backward compatibility
81
+ return CloudDeployerAdapter()
82
+
83
+ def start(self, schedule_expr: str, max_retries: int = 3) -> bool:
84
+ """
85
+ Start scheduled deployment.
86
+
87
+ Args:
88
+ schedule_expr: Schedule expression (e.g., "daily", "*/6h", "3600")
89
+ max_retries: Maximum retry attempts on failure
90
+
91
+ Returns:
92
+ True if scheduler started successfully
93
+ """
94
+ if self.is_running:
95
+ logger.warning("Scheduler is already running")
96
+ return False
97
+
98
+ try:
99
+ interval = ScheduleParser.parse(schedule_expr)
100
+ self.is_running = True
101
+ self._stop_event.clear()
102
+
103
+ self._thread = threading.Thread(
104
+ target=self._run_schedule,
105
+ args=(interval, max_retries),
106
+ daemon=True
107
+ )
108
+ self._thread.start()
109
+
110
+ logger.info(f"Deployment scheduler started with {interval}s interval")
111
+ return True
112
+
113
+ except Exception as e:
114
+ logger.error(f"Failed to start scheduler: {e}")
115
+ self.is_running = False
116
+ return False
117
+
118
+ def stop(self) -> bool:
119
+ """Stop the scheduler."""
120
+ if not self.is_running:
121
+ return True
122
+
123
+ self._stop_event.set()
124
+ if self._thread and self._thread.is_alive():
125
+ self._thread.join(timeout=5)
126
+
127
+ self.is_running = False
128
+ logger.info("Deployment scheduler stopped")
129
+ return True
130
+
131
+ def _run_schedule(self, interval: int, max_retries: int):
132
+ """Internal method to run scheduled deployments."""
133
+ deployer = self._get_deployer()
134
+
135
+ while not self._stop_event.is_set():
136
+ logger.info("Starting scheduled deployment")
137
+
138
+ success = False
139
+ for attempt in range(max_retries):
140
+ try:
141
+ if deployer.deploy():
142
+ logger.info(f"Deployment successful on attempt {attempt + 1}")
143
+ success = True
144
+ break
145
+ else:
146
+ logger.warning(f"Deployment failed on attempt {attempt + 1}")
147
+ except Exception as e:
148
+ logger.error(f"Deployment error on attempt {attempt + 1}: {e}")
149
+
150
+ if attempt < max_retries - 1:
151
+ time.sleep(30) # Wait before retry
152
+
153
+ if not success:
154
+ logger.error(f"Deployment failed after {max_retries} attempts")
155
+
156
+ # Wait for next scheduled time
157
+ self._stop_event.wait(interval)
158
+
159
+ def deploy_once(self) -> bool:
160
+ """Execute a single deployment immediately."""
161
+ deployer = self._get_deployer()
162
+ try:
163
+ return deployer.deploy()
164
+ except Exception as e:
165
+ logger.error(f"One-time deployment failed: {e}")
166
+ return False
167
+
168
+ def create_scheduler(provider: str = "gcp", config: Optional[Dict[str, Any]] = None) -> DeploymentScheduler:
169
+ """
170
+ Factory function to create scheduler for different providers.
171
+
172
+ Args:
173
+ provider: Deployment provider ("gcp", "aws", "azure", etc.)
174
+ config: Optional configuration dict
175
+
176
+ Returns:
177
+ Configured DeploymentScheduler instance
178
+ """
179
+ scheduler = DeploymentScheduler(config)
180
+
181
+ # Provider-specific deployer setup can be added here
182
+ if provider == "gcp":
183
+ # Default CloudDeployer for GCP
184
+ pass
185
+ elif provider == "aws":
186
+ # Future: AWS deployer implementation
187
+ logger.warning("AWS provider not yet implemented, using default")
188
+ elif provider == "azure":
189
+ # Future: Azure deployer implementation
190
+ logger.warning("Azure provider not yet implemented, using default")
191
+ else:
192
+ logger.warning(f"Unknown provider {provider}, using default")
193
+
194
+ return scheduler
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,21 @@
1
+ import subprocess
2
+ import sys
3
+ import os
4
+
5
+ def build(setup_kwargs):
6
+ try:
7
+ # Get the directory of the current script
8
+ script_dir = os.path.dirname(os.path.abspath(__file__))
9
+
10
+ # Construct the path to post_install.py
11
+ post_install_script = os.path.join(script_dir, 'post_install.py')
12
+
13
+ # Run the post_install.py script
14
+ subprocess.check_call([sys.executable, post_install_script])
15
+ except subprocess.CalledProcessError as e:
16
+ print(f"Error occurred while running the post-install script: {e}")
17
+ sys.exit(1)
18
+ return setup_kwargs
19
+
20
+ if __name__ == "__main__":
21
+ build({})
@@ -0,0 +1,23 @@
1
+ import os
2
+ import sys
3
+ import subprocess
4
+ import logging
5
+
6
+ def install_playwright():
7
+ """Install playwright browsers."""
8
+ try:
9
+ subprocess.run([sys.executable, "-m", "playwright", "install"], check=True)
10
+ logging.info("Playwright browsers installed successfully")
11
+ except subprocess.CalledProcessError as e:
12
+ logging.error(f"Failed to install playwright browsers: {e}")
13
+ except Exception as e:
14
+ logging.error(f"Unexpected error installing playwright browsers: {e}")
15
+
16
+ def main():
17
+ """Post-installation script."""
18
+ # Check if this is a chat or code installation
19
+ if any(extra in sys.argv for extra in ['chat', 'code']):
20
+ install_playwright()
21
+
22
+ if __name__ == "__main__":
23
+ main()
@@ -0,0 +1,25 @@
1
+ import subprocess
2
+ import os
3
+ import sys
4
+ import platform
5
+
6
+ def main():
7
+ script_dir = os.path.dirname(os.path.abspath(__file__))
8
+ script_path = os.path.join(script_dir, 'setup_conda_env.sh')
9
+
10
+ if platform.system() == 'Windows':
11
+ print("Windows detected. Please run the setup_conda_env.sh script manually in Git Bash or WSL.")
12
+ print(f"Script location: {script_path}")
13
+ sys.exit(1)
14
+
15
+ try:
16
+ subprocess.check_call(['bash', script_path])
17
+ except subprocess.CalledProcessError as e:
18
+ print(f"Error occurred while running the setup script: {e}")
19
+ print("Setup failed. Please check the error message above and try to resolve the issue.")
20
+ sys.exit(1)
21
+
22
+ print("Conda environment setup completed successfully!")
23
+
24
+ if __name__ == "__main__":
25
+ main()
praisonai/setup.py ADDED
@@ -0,0 +1,16 @@
1
+ from setuptools import setup
2
+ from setuptools.command.install import install
3
+ import subprocess
4
+ import sys
5
+
6
+ class PostInstallCommand(install):
7
+ def run(self):
8
+ install.run(self)
9
+ # Install Playwright browsers
10
+ subprocess.check_call([sys.executable, '-m', 'playwright', 'install'])
11
+
12
+ setup(
13
+ cmdclass={
14
+ 'install': PostInstallCommand,
15
+ }
16
+ )
@@ -0,0 +1,116 @@
1
+ """
2
+ PraisonAI Templates Module
3
+
4
+ Provides template loading, caching, and resolution for Agent/Workflow configurations.
5
+ All imports are lazy to ensure zero performance impact when not used.
6
+ """
7
+
8
+ __all__ = [
9
+ "TemplateLoader",
10
+ "TemplateResolver",
11
+ "TemplateCache",
12
+ "TemplateRegistry",
13
+ "TemplateSecurity",
14
+ "TemplateDiscovery",
15
+ "DiscoveredTemplate",
16
+ "DependencyChecker",
17
+ "StrictModeError",
18
+ "ToolsDoctor",
19
+ "ToolOverrideLoader",
20
+ "SecurityError",
21
+ "load_template",
22
+ "list_templates",
23
+ "search_templates",
24
+ "install_template",
25
+ "clear_cache",
26
+ "discover_templates",
27
+ "find_template_path",
28
+ ]
29
+
30
+ # Lazy loading implementation
31
+ _module_cache = {}
32
+
33
+
34
+ def __getattr__(name):
35
+ """Lazy load template components to avoid import overhead."""
36
+ if name in _module_cache:
37
+ return _module_cache[name]
38
+
39
+ if name == "TemplateLoader":
40
+ from .loader import TemplateLoader
41
+ _module_cache[name] = TemplateLoader
42
+ return TemplateLoader
43
+ elif name == "TemplateResolver":
44
+ from .resolver import TemplateResolver
45
+ _module_cache[name] = TemplateResolver
46
+ return TemplateResolver
47
+ elif name == "TemplateCache":
48
+ from .cache import TemplateCache
49
+ _module_cache[name] = TemplateCache
50
+ return TemplateCache
51
+ elif name == "TemplateRegistry":
52
+ from .registry import TemplateRegistry
53
+ _module_cache[name] = TemplateRegistry
54
+ return TemplateRegistry
55
+ elif name == "TemplateSecurity":
56
+ from .security import TemplateSecurity
57
+ _module_cache[name] = TemplateSecurity
58
+ return TemplateSecurity
59
+ elif name == "load_template":
60
+ from .loader import load_template
61
+ _module_cache[name] = load_template
62
+ return load_template
63
+ elif name == "list_templates":
64
+ from .registry import list_templates
65
+ _module_cache[name] = list_templates
66
+ return list_templates
67
+ elif name == "search_templates":
68
+ from .registry import search_templates
69
+ _module_cache[name] = search_templates
70
+ return search_templates
71
+ elif name == "install_template":
72
+ from .registry import install_template
73
+ _module_cache[name] = install_template
74
+ return install_template
75
+ elif name == "clear_cache":
76
+ from .cache import clear_cache
77
+ _module_cache[name] = clear_cache
78
+ return clear_cache
79
+ elif name == "TemplateDiscovery":
80
+ from .discovery import TemplateDiscovery
81
+ _module_cache[name] = TemplateDiscovery
82
+ return TemplateDiscovery
83
+ elif name == "DiscoveredTemplate":
84
+ from .discovery import DiscoveredTemplate
85
+ _module_cache[name] = DiscoveredTemplate
86
+ return DiscoveredTemplate
87
+ elif name == "discover_templates":
88
+ from .discovery import discover_templates
89
+ _module_cache[name] = discover_templates
90
+ return discover_templates
91
+ elif name == "find_template_path":
92
+ from .discovery import find_template_path
93
+ _module_cache[name] = find_template_path
94
+ return find_template_path
95
+ elif name == "DependencyChecker":
96
+ from .dependency_checker import DependencyChecker
97
+ _module_cache[name] = DependencyChecker
98
+ return DependencyChecker
99
+ elif name == "StrictModeError":
100
+ from .dependency_checker import StrictModeError
101
+ _module_cache[name] = StrictModeError
102
+ return StrictModeError
103
+ elif name == "ToolsDoctor":
104
+ from .tools_doctor import ToolsDoctor
105
+ _module_cache[name] = ToolsDoctor
106
+ return ToolsDoctor
107
+ elif name == "ToolOverrideLoader":
108
+ from .tool_override import ToolOverrideLoader
109
+ _module_cache[name] = ToolOverrideLoader
110
+ return ToolOverrideLoader
111
+ elif name == "SecurityError":
112
+ from .tool_override import SecurityError
113
+ _module_cache[name] = SecurityError
114
+ return SecurityError
115
+
116
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")