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,382 @@
1
+ """
2
+ LLM Provider Registry - Extensible provider registration system for Python.
3
+
4
+ This module provides parity with the TypeScript ProviderRegistry,
5
+ allowing users to register custom LLM providers that can be resolved by name.
6
+
7
+ Example:
8
+ from praisonai.llm import register_llm_provider, create_llm_provider
9
+
10
+ class CloudflareProvider:
11
+ provider_id = "cloudflare"
12
+ def __init__(self, model_id, config=None):
13
+ self.model_id = model_id
14
+ self.config = config or {}
15
+ def generate(self, prompt):
16
+ # Implementation
17
+ pass
18
+
19
+ register_llm_provider("cloudflare", CloudflareProvider)
20
+ provider = create_llm_provider("cloudflare/workers-ai")
21
+ """
22
+
23
+ from typing import Any, Callable, Dict, List, Optional, Type, Union
24
+
25
+
26
+ # Type aliases
27
+ ProviderClass = Type[Any] # Class with __init__(model_id, config)
28
+ ProviderFactory = Callable[[str, Optional[Dict[str, Any]]], Any]
29
+ ProviderType = Union[ProviderClass, ProviderFactory]
30
+
31
+
32
+ class LLMProviderRegistry:
33
+ """
34
+ Registry for LLM providers.
35
+
36
+ Manages registration and resolution of LLM providers by name.
37
+ Supports lazy loading, aliases, and isolated instances.
38
+ """
39
+
40
+ def __init__(self):
41
+ """Initialize an empty registry."""
42
+ self._providers: Dict[str, ProviderType] = {}
43
+ self._aliases: Dict[str, str] = {} # alias -> canonical name
44
+
45
+ def register(
46
+ self,
47
+ name: str,
48
+ provider: ProviderType,
49
+ *,
50
+ override: bool = False,
51
+ aliases: Optional[List[str]] = None
52
+ ) -> None:
53
+ """
54
+ Register a provider by name.
55
+
56
+ Args:
57
+ name: Provider name (e.g., 'cloudflare', 'ollama')
58
+ provider: Provider class or factory function
59
+ override: Allow overwriting existing registration
60
+ aliases: Additional names that resolve to this provider
61
+
62
+ Raises:
63
+ ValueError: If name is already registered (unless override=True)
64
+ """
65
+ normalized_name = name.lower()
66
+
67
+ # Check for existing registration
68
+ if normalized_name in self._providers and not override:
69
+ raise ValueError(
70
+ f"Provider '{name}' is already registered. "
71
+ f"Use override=True to replace it."
72
+ )
73
+
74
+ self._providers[normalized_name] = provider
75
+
76
+ # Register aliases
77
+ if aliases:
78
+ for alias in aliases:
79
+ normalized_alias = alias.lower()
80
+ # Check collision with existing provider name
81
+ if normalized_alias in self._providers and not override:
82
+ raise ValueError(
83
+ f"Alias '{alias}' conflicts with existing provider name. "
84
+ f"Use override=True to replace it."
85
+ )
86
+ # Check collision with existing alias
87
+ if normalized_alias in self._aliases and not override:
88
+ existing_target = self._aliases[normalized_alias]
89
+ raise ValueError(
90
+ f"Alias '{alias}' is already registered (points to '{existing_target}'). "
91
+ f"Use override=True to replace it."
92
+ )
93
+ self._aliases[normalized_alias] = normalized_name
94
+
95
+ def unregister(self, name: str) -> bool:
96
+ """
97
+ Unregister a provider by name.
98
+
99
+ Args:
100
+ name: Provider name to unregister
101
+
102
+ Returns:
103
+ True if provider was unregistered, False if not found
104
+ """
105
+ normalized_name = name.lower()
106
+
107
+ # Check if it's an alias
108
+ if normalized_name in self._aliases:
109
+ del self._aliases[normalized_name]
110
+ return True
111
+
112
+ # Check if it's a canonical name
113
+ if normalized_name in self._providers:
114
+ # Remove all aliases pointing to this provider
115
+ aliases_to_remove = [
116
+ alias for alias, canonical in self._aliases.items()
117
+ if canonical == normalized_name
118
+ ]
119
+ for alias in aliases_to_remove:
120
+ del self._aliases[alias]
121
+
122
+ del self._providers[normalized_name]
123
+ return True
124
+
125
+ return False
126
+
127
+ def has(self, name: str) -> bool:
128
+ """
129
+ Check if a provider is registered.
130
+
131
+ Args:
132
+ name: Provider name to check
133
+
134
+ Returns:
135
+ True if provider is registered
136
+ """
137
+ normalized_name = name.lower()
138
+ return normalized_name in self._providers or normalized_name in self._aliases
139
+
140
+ def list(self) -> List[str]:
141
+ """
142
+ List all registered provider names (canonical names only).
143
+
144
+ Returns:
145
+ List of provider names
146
+ """
147
+ return list(self._providers.keys())
148
+
149
+ def list_all(self) -> List[str]:
150
+ """
151
+ List all names including aliases.
152
+
153
+ Returns:
154
+ List of all registered names and aliases
155
+ """
156
+ return list(self._providers.keys()) + list(self._aliases.keys())
157
+
158
+ def resolve(
159
+ self,
160
+ name: str,
161
+ model_id: str,
162
+ config: Optional[Dict[str, Any]] = None
163
+ ) -> Any:
164
+ """
165
+ Resolve a provider by name, creating an instance.
166
+
167
+ Args:
168
+ name: Provider name
169
+ model_id: Model ID to pass to constructor
170
+ config: Optional provider config
171
+
172
+ Returns:
173
+ Provider instance
174
+
175
+ Raises:
176
+ ValueError: If provider not found
177
+ """
178
+ normalized_name = name.lower()
179
+
180
+ # Resolve alias to canonical name
181
+ canonical_name = self._aliases.get(normalized_name, normalized_name)
182
+
183
+ provider = self._providers.get(canonical_name)
184
+ if provider is None:
185
+ available = self.list()
186
+ raise ValueError(
187
+ f"Unknown provider: '{name}'. "
188
+ f"Available providers: {', '.join(available) if available else 'none'}. "
189
+ f"Register a custom provider with register_llm_provider('{name}', YourProviderClass)."
190
+ )
191
+
192
+ # Create instance
193
+ return provider(model_id, config)
194
+
195
+ def get(self, name: str) -> Optional[ProviderType]:
196
+ """
197
+ Get the provider class/factory without instantiating.
198
+
199
+ Args:
200
+ name: Provider name
201
+
202
+ Returns:
203
+ Provider class/factory or None
204
+ """
205
+ normalized_name = name.lower()
206
+ canonical_name = self._aliases.get(normalized_name, normalized_name)
207
+ return self._providers.get(canonical_name)
208
+
209
+
210
+ # ============================================================================
211
+ # Default Registry Singleton
212
+ # ============================================================================
213
+
214
+ _default_registry: Optional[LLMProviderRegistry] = None
215
+
216
+
217
+ def get_default_llm_registry() -> LLMProviderRegistry:
218
+ """
219
+ Get the default global LLM provider registry.
220
+
221
+ This is the registry used by create_llm_provider() when no custom registry
222
+ is specified.
223
+ """
224
+ global _default_registry
225
+ if _default_registry is None:
226
+ _default_registry = LLMProviderRegistry()
227
+ _register_builtin_providers(_default_registry)
228
+ return _default_registry
229
+
230
+
231
+ def _register_builtin_providers(registry: LLMProviderRegistry) -> None:
232
+ """
233
+ Register built-in providers to a registry.
234
+
235
+ Uses lazy loading to avoid importing heavy dependencies at module load time.
236
+ """
237
+ # Note: In Python, the actual LLM providers are in praisonaiagents.llm
238
+ # which uses LiteLLM. This registry is for custom provider extensions.
239
+ # Built-in providers are handled by LiteLLM automatically.
240
+ pass
241
+
242
+
243
+ def register_llm_provider(
244
+ name: str,
245
+ provider: ProviderType,
246
+ *,
247
+ override: bool = False,
248
+ aliases: Optional[List[str]] = None
249
+ ) -> None:
250
+ """
251
+ Register a provider to the default global registry.
252
+
253
+ Example:
254
+ from praisonai.llm import register_llm_provider
255
+
256
+ class CloudflareProvider:
257
+ provider_id = "cloudflare"
258
+ def __init__(self, model_id, config=None):
259
+ self.model_id = model_id
260
+ self.config = config or {}
261
+
262
+ register_llm_provider("cloudflare", CloudflareProvider)
263
+ """
264
+ get_default_llm_registry().register(name, provider, override=override, aliases=aliases)
265
+
266
+
267
+ def unregister_llm_provider(name: str) -> bool:
268
+ """Unregister a provider from the default global registry."""
269
+ return get_default_llm_registry().unregister(name)
270
+
271
+
272
+ def has_llm_provider(name: str) -> bool:
273
+ """Check if a provider is registered in the default registry."""
274
+ return get_default_llm_registry().has(name)
275
+
276
+
277
+ def list_llm_providers() -> List[str]:
278
+ """List all providers in the default registry."""
279
+ return get_default_llm_registry().list()
280
+
281
+
282
+ # ============================================================================
283
+ # Provider Creation
284
+ # ============================================================================
285
+
286
+ def parse_model_string(model: str) -> Dict[str, str]:
287
+ """
288
+ Parse model string into provider and model ID.
289
+
290
+ Supports formats:
291
+ - "provider/model" (e.g., "openai/gpt-4o")
292
+ - "model" (defaults based on prefix)
293
+
294
+ Args:
295
+ model: Model string
296
+
297
+ Returns:
298
+ Dict with 'provider_id' and 'model_id' keys
299
+ """
300
+ if "/" in model:
301
+ parts = model.split("/", 1)
302
+ return {"provider_id": parts[0].lower(), "model_id": parts[1]}
303
+
304
+ # Default based on model prefix
305
+ model_lower = model.lower()
306
+ if model_lower.startswith("gpt-") or model_lower.startswith("o1") or model_lower.startswith("o3"):
307
+ return {"provider_id": "openai", "model_id": model}
308
+ if model_lower.startswith("claude-"):
309
+ return {"provider_id": "anthropic", "model_id": model}
310
+ if model_lower.startswith("gemini-"):
311
+ return {"provider_id": "google", "model_id": model}
312
+
313
+ # Default to openai
314
+ return {"provider_id": "openai", "model_id": model}
315
+
316
+
317
+ def create_llm_provider(
318
+ input_value: Union[str, Dict[str, Any], Any],
319
+ *,
320
+ registry: Optional[LLMProviderRegistry] = None,
321
+ config: Optional[Dict[str, Any]] = None
322
+ ) -> Any:
323
+ """
324
+ Create a provider instance from various input types.
325
+
326
+ Args:
327
+ input_value: One of:
328
+ - String: "provider/model" or "model"
329
+ - Dict: {"name": "provider", "model_id": "model", "config": {...}}
330
+ - Provider instance: passed through
331
+ registry: Optional custom registry (defaults to global)
332
+ config: Optional provider config
333
+
334
+ Returns:
335
+ Provider instance
336
+
337
+ Example:
338
+ # String input
339
+ provider = create_llm_provider("openai/gpt-4o")
340
+
341
+ # Custom provider (after registration)
342
+ register_llm_provider("cloudflare", CloudflareProvider)
343
+ provider = create_llm_provider("cloudflare/workers-ai")
344
+
345
+ # Provider instance (pass-through)
346
+ provider = create_llm_provider(existing_provider)
347
+
348
+ # Spec dict
349
+ provider = create_llm_provider({
350
+ "name": "openai",
351
+ "model_id": "gpt-4o",
352
+ "config": {"timeout": 5000}
353
+ })
354
+ """
355
+ reg = registry or get_default_llm_registry()
356
+
357
+ # Case 1: Already a provider instance (has provider_id and model_id)
358
+ if hasattr(input_value, "provider_id") and hasattr(input_value, "model_id"):
359
+ return input_value
360
+
361
+ # Case 2: Spec dict
362
+ if isinstance(input_value, dict) and "name" in input_value:
363
+ name = input_value["name"]
364
+ model_id = input_value.get("model_id", "default")
365
+ provider_config = input_value.get("config") or config
366
+ return reg.resolve(name, model_id, provider_config)
367
+
368
+ # Case 3: String - parse and resolve
369
+ if isinstance(input_value, str):
370
+ parsed = parse_model_string(input_value)
371
+ return reg.resolve(parsed["provider_id"], parsed["model_id"], config)
372
+
373
+ raise ValueError(
374
+ f"Invalid provider input. Expected string, provider instance, or spec dict. "
375
+ f"Got: {type(input_value).__name__}"
376
+ )
377
+
378
+
379
+ def _reset_default_registry() -> None:
380
+ """Reset the default registry (mainly for testing)."""
381
+ global _default_registry
382
+ _default_registry = None
@@ -0,0 +1,152 @@
1
+ """
2
+ PraisonAI MCP Server Module
3
+
4
+ Exposes PraisonAI capabilities as an MCP server that any MCP client can connect to.
5
+
6
+ MCP Protocol Version: 2025-11-25
7
+
8
+ Supports:
9
+ - STDIO transport (default, for Claude Desktop, Cursor, etc.)
10
+ - HTTP Stream transport (MCP 2025-11-25 spec)
11
+ - Recipe-to-MCP server bridge
12
+ - Tasks API (experimental)
13
+ - Elicitation (form and URL modes)
14
+ - OAuth 2.1 / OpenID Connect authentication
15
+ - Icons and rich metadata
16
+
17
+ Usage:
18
+ # STDIO mode (for Claude Desktop config)
19
+ praisonai mcp serve --transport stdio
20
+
21
+ # HTTP Stream mode
22
+ praisonai mcp serve --transport http-stream --port 8080
23
+
24
+ # Serve a recipe as MCP server
25
+ praisonai mcp serve-recipe support-reply --transport stdio
26
+
27
+ # Programmatic usage
28
+ from praisonai.mcp_server import MCPServer, RecipeMCPAdapter
29
+
30
+ server = MCPServer()
31
+ server.run(transport="stdio")
32
+
33
+ # Recipe as MCP server
34
+ adapter = RecipeMCPAdapter("support-reply")
35
+ adapter.load()
36
+ server = adapter.to_mcp_server()
37
+ server.run(transport="stdio")
38
+ """
39
+
40
+ __all__ = [
41
+ # Core server
42
+ "MCPServer",
43
+ "MCPToolRegistry",
44
+ "MCPResourceRegistry",
45
+ "MCPPromptRegistry",
46
+ "register_tool",
47
+ "register_resource",
48
+ "register_prompt",
49
+ # Recipe adapter
50
+ "RecipeMCPAdapter",
51
+ "RecipeMCPConfig",
52
+ "create_recipe_mcp_server",
53
+ # Tasks API
54
+ "TaskManager",
55
+ "TaskStore",
56
+ "Task",
57
+ "TaskState",
58
+ # Elicitation
59
+ "ElicitationHandler",
60
+ "ElicitationRequest",
61
+ "ElicitationResult",
62
+ # Sampling
63
+ "SamplingHandler",
64
+ "SamplingRequest",
65
+ "SamplingResponse",
66
+ # Icons
67
+ "IconMetadata",
68
+ "RichMetadata",
69
+ ]
70
+
71
+
72
+ def __getattr__(name):
73
+ """Lazy load server components."""
74
+ # Core server
75
+ if name == "MCPServer":
76
+ from .server import MCPServer
77
+ return MCPServer
78
+ elif name == "MCPToolRegistry":
79
+ from .registry import MCPToolRegistry
80
+ return MCPToolRegistry
81
+ elif name == "MCPResourceRegistry":
82
+ from .registry import MCPResourceRegistry
83
+ return MCPResourceRegistry
84
+ elif name == "MCPPromptRegistry":
85
+ from .registry import MCPPromptRegistry
86
+ return MCPPromptRegistry
87
+ elif name == "register_tool":
88
+ from .registry import register_tool
89
+ return register_tool
90
+ elif name == "register_resource":
91
+ from .registry import register_resource
92
+ return register_resource
93
+ elif name == "register_prompt":
94
+ from .registry import register_prompt
95
+ return register_prompt
96
+
97
+ # Recipe adapter
98
+ elif name == "RecipeMCPAdapter":
99
+ from .recipe_adapter import RecipeMCPAdapter
100
+ return RecipeMCPAdapter
101
+ elif name == "RecipeMCPConfig":
102
+ from .recipe_adapter import RecipeMCPConfig
103
+ return RecipeMCPConfig
104
+ elif name == "create_recipe_mcp_server":
105
+ from .recipe_adapter import create_recipe_mcp_server
106
+ return create_recipe_mcp_server
107
+
108
+ # Tasks API
109
+ elif name == "TaskManager":
110
+ from .tasks import TaskManager
111
+ return TaskManager
112
+ elif name == "TaskStore":
113
+ from .tasks import TaskStore
114
+ return TaskStore
115
+ elif name == "Task":
116
+ from .tasks import Task
117
+ return Task
118
+ elif name == "TaskState":
119
+ from .tasks import TaskState
120
+ return TaskState
121
+
122
+ # Elicitation
123
+ elif name == "ElicitationHandler":
124
+ from .elicitation import ElicitationHandler
125
+ return ElicitationHandler
126
+ elif name == "ElicitationRequest":
127
+ from .elicitation import ElicitationRequest
128
+ return ElicitationRequest
129
+ elif name == "ElicitationResult":
130
+ from .elicitation import ElicitationResult
131
+ return ElicitationResult
132
+
133
+ # Sampling
134
+ elif name == "SamplingHandler":
135
+ from .sampling import SamplingHandler
136
+ return SamplingHandler
137
+ elif name == "SamplingRequest":
138
+ from .sampling import SamplingRequest
139
+ return SamplingRequest
140
+ elif name == "SamplingResponse":
141
+ from .sampling import SamplingResponse
142
+ return SamplingResponse
143
+
144
+ # Icons
145
+ elif name == "IconMetadata":
146
+ from .icons import IconMetadata
147
+ return IconMetadata
148
+ elif name == "RichMetadata":
149
+ from .icons import RichMetadata
150
+ return RichMetadata
151
+
152
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
@@ -0,0 +1,74 @@
1
+ """
2
+ MCP Adapters
3
+
4
+ Adapters that convert PraisonAI capabilities, CLI features, and agent operations
5
+ into MCP tools, resources, and prompts.
6
+ """
7
+
8
+ __all__ = [
9
+ "register_all",
10
+ "register_all_tools",
11
+ "register_capability_tools",
12
+ "register_extended_capability_tools",
13
+ "register_agent_tools",
14
+ "register_memory_tools",
15
+ "register_knowledge_tools",
16
+ "register_cli_tools",
17
+ "register_mcp_resources",
18
+ "register_mcp_prompts",
19
+ "register_praisonai_tools",
20
+ "is_bridge_available",
21
+ ]
22
+
23
+
24
+ def __getattr__(name):
25
+ """Lazy load adapters."""
26
+ if name == "register_all":
27
+ from .capabilities import register_all_tools
28
+ from .extended_capabilities import register_extended_capability_tools
29
+ from .cli_tools import register_cli_tools
30
+ from .resources import register_mcp_resources
31
+ from .prompts import register_mcp_prompts
32
+
33
+ def _register_all():
34
+ register_all_tools()
35
+ register_extended_capability_tools()
36
+ register_cli_tools()
37
+ register_mcp_resources()
38
+ register_mcp_prompts()
39
+
40
+ return _register_all
41
+ elif name == "register_all_tools":
42
+ from .capabilities import register_all_tools
43
+ return register_all_tools
44
+ elif name == "register_capability_tools":
45
+ from .capabilities import register_capability_tools
46
+ return register_capability_tools
47
+ elif name == "register_extended_capability_tools":
48
+ from .extended_capabilities import register_extended_capability_tools
49
+ return register_extended_capability_tools
50
+ elif name == "register_agent_tools":
51
+ from .agents import register_agent_tools
52
+ return register_agent_tools
53
+ elif name == "register_memory_tools":
54
+ from .memory import register_memory_tools
55
+ return register_memory_tools
56
+ elif name == "register_knowledge_tools":
57
+ from .knowledge import register_knowledge_tools
58
+ return register_knowledge_tools
59
+ elif name == "register_cli_tools":
60
+ from .cli_tools import register_cli_tools
61
+ return register_cli_tools
62
+ elif name == "register_mcp_resources":
63
+ from .resources import register_mcp_resources
64
+ return register_mcp_resources
65
+ elif name == "register_mcp_prompts":
66
+ from .prompts import register_mcp_prompts
67
+ return register_mcp_prompts
68
+ elif name == "register_praisonai_tools":
69
+ from .tools_bridge import register_praisonai_tools
70
+ return register_praisonai_tools
71
+ elif name == "is_bridge_available":
72
+ from .tools_bridge import is_bridge_available
73
+ return is_bridge_available
74
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")