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,531 @@
1
+ """
2
+ Knowledge Handler for CLI.
3
+
4
+ Provides RAG/vector store management with full knowledge stack support.
5
+
6
+ Usage:
7
+ praisonai knowledge add document.pdf
8
+ praisonai knowledge add ./docs/
9
+ praisonai knowledge query "How to authenticate?"
10
+ praisonai knowledge list
11
+ praisonai knowledge clear
12
+ praisonai knowledge stats
13
+ """
14
+
15
+ import os
16
+ from typing import Any, Dict, List, Optional
17
+ from .base import CommandHandler
18
+
19
+
20
+ class KnowledgeHandler(CommandHandler):
21
+ """
22
+ Handler for knowledge command.
23
+
24
+ Manages knowledge base for RAG (Retrieval Augmented Generation).
25
+
26
+ Supports:
27
+ - Multiple vector stores (chroma, pinecone, qdrant, weaviate, memory)
28
+ - Retrieval strategies (basic, fusion, recursive, auto_merge)
29
+ - Rerankers (simple, llm, cross_encoder, cohere)
30
+ - Index types (vector, keyword, hybrid)
31
+ - Query modes (default, sub_question, summarize)
32
+
33
+ Example:
34
+ praisonai knowledge add document.pdf
35
+ praisonai knowledge add ./docs/
36
+ praisonai knowledge query "How to authenticate?" --retrieval fusion
37
+ praisonai knowledge list
38
+ praisonai knowledge clear
39
+ praisonai knowledge stats
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ verbose: bool = False,
45
+ workspace: str = None,
46
+ vector_store: str = "chroma",
47
+ retrieval_strategy: str = "basic",
48
+ reranker: Optional[str] = None,
49
+ index_type: str = "vector",
50
+ query_mode: str = "default",
51
+ session_id: Optional[str] = None,
52
+ db: Optional[str] = None
53
+ ):
54
+ super().__init__(verbose)
55
+ self.workspace = workspace or os.getcwd()
56
+ self.vector_store = vector_store
57
+ self.retrieval_strategy = retrieval_strategy
58
+ self.reranker = reranker
59
+ self.index_type = index_type
60
+ self.query_mode = query_mode
61
+ self.session_id = session_id
62
+ self.db = db
63
+ self._knowledge = None
64
+ self._embedding_fn = None
65
+
66
+ @property
67
+ def feature_name(self) -> str:
68
+ return "knowledge"
69
+
70
+ def get_actions(self) -> List[str]:
71
+ return ["add", "query", "search", "list", "clear", "stats", "info", "export", "import", "help"]
72
+
73
+ def get_help_text(self) -> str:
74
+ return """
75
+ Knowledge Commands:
76
+ praisonai knowledge add <file|dir|url> - Add document(s) to knowledge base
77
+ praisonai knowledge query "<question>" - Query knowledge base with RAG
78
+ praisonai knowledge list - List indexed documents
79
+ praisonai knowledge clear - Clear knowledge base
80
+ praisonai knowledge stats - Show knowledge base statistics
81
+ praisonai knowledge export <file.json> - Export knowledge base to JSON file
82
+ praisonai knowledge import <file.json> - Import knowledge base from JSON file
83
+ praisonai knowledge help - Show this help message
84
+
85
+ Options:
86
+ --workspace <path> - Workspace directory (default: current)
87
+ --vector-store <name> - Vector store backend
88
+ Values: memory, chroma, pinecone, qdrant, weaviate
89
+ Default: chroma
90
+ --retrieval-strategy <strategy> - Retrieval strategy
91
+ Values: basic, fusion, recursive, auto_merge
92
+ Default: basic
93
+ --reranker <name> - Reranker for result ordering
94
+ Values: none, simple, llm, cross_encoder, cohere
95
+ Default: none
96
+ --index-type <type> - Index type for search
97
+ Values: vector, keyword, hybrid
98
+ Default: vector
99
+ --query-mode <mode> - Query processing mode
100
+ Values: default, sub_question, summarize
101
+ Default: default
102
+ --session <id> - Session ID for persistence
103
+ --db <path> - Database path for persistence
104
+
105
+ Examples:
106
+ praisonai knowledge add document.pdf
107
+ praisonai knowledge add ./docs/
108
+ praisonai knowledge query "How to authenticate?" --retrieval-strategy fusion
109
+ praisonai knowledge query "Compare approaches" --reranker simple --query-mode sub_question
110
+ """
111
+
112
+ def _get_knowledge(self):
113
+ """Lazy load Knowledge instance with configured options."""
114
+ if self._knowledge is None:
115
+ try:
116
+ from praisonaiagents import Knowledge
117
+
118
+ # Build config based on options
119
+ config = {
120
+ "vector_store": {
121
+ "provider": self.vector_store,
122
+ "config": {
123
+ "path": os.path.join(self.workspace, ".praison", "knowledge")
124
+ }
125
+ }
126
+ }
127
+
128
+ self._knowledge = Knowledge(config=config)
129
+ except ImportError:
130
+ self.print_status(
131
+ "Knowledge requires praisonaiagents. Install with: pip install praisonaiagents[knowledge]",
132
+ "error"
133
+ )
134
+ return None
135
+ return self._knowledge
136
+
137
+ def _get_embedding_fn(self):
138
+ """Get embedding function."""
139
+ if self._embedding_fn is None:
140
+ try:
141
+ import openai
142
+ client = openai.OpenAI()
143
+
144
+ def embed(text: str) -> List[float]:
145
+ response = client.embeddings.create(
146
+ input=text,
147
+ model="text-embedding-3-small"
148
+ )
149
+ return response.data[0].embedding
150
+
151
+ self._embedding_fn = embed
152
+ except Exception as e:
153
+ self.print_status(f"Failed to initialize embeddings: {e}", "warning")
154
+ return self._embedding_fn
155
+
156
+ def action_add(self, args: List[str], **kwargs) -> bool:
157
+ """
158
+ Add document(s) to knowledge base.
159
+
160
+ Supports:
161
+ - File paths (pdf, docx, txt, md, html, etc.)
162
+ - Directories (recursive)
163
+ - Glob patterns (*.pdf, docs/**/*.md)
164
+ - URLs (http://, https://)
165
+
166
+ Args:
167
+ args: List containing file/directory/URL paths
168
+
169
+ Returns:
170
+ True if successful
171
+ """
172
+ if not args:
173
+ self.print_status("Usage: praisonai knowledge add <file|directory|url|glob>", "error")
174
+ return False
175
+
176
+ knowledge = self._get_knowledge()
177
+ if not knowledge:
178
+ return False
179
+
180
+ source = args[0]
181
+
182
+ # Check if URL
183
+ if source.startswith(("http://", "https://")):
184
+ try:
185
+ knowledge.add(source)
186
+ self.print_status(f"✅ Added URL: {source}", "success")
187
+ return True
188
+ except Exception as e:
189
+ self.print_status(f"Failed to add URL: {e}", "error")
190
+ return False
191
+
192
+ # Expand path
193
+ if not os.path.isabs(source):
194
+ source = os.path.join(self.workspace, source)
195
+
196
+ # Check for glob pattern
197
+ if "*" in source or "?" in source:
198
+ import glob
199
+ files = glob.glob(source, recursive=True)
200
+ if not files:
201
+ self.print_status(f"No files match pattern: {source}", "warning")
202
+ return False
203
+
204
+ count = 0
205
+ for file_path in files:
206
+ if os.path.isfile(file_path):
207
+ try:
208
+ knowledge.add(file_path)
209
+ count += 1
210
+ except Exception as e:
211
+ self.print_status(f"Failed to add {file_path}: {e}", "warning")
212
+
213
+ self.print_status(f"✅ Added {count} files matching {args[0]}", "success")
214
+ return True
215
+
216
+ if not os.path.exists(source):
217
+ self.print_status(f"Path not found: {source}", "error")
218
+ return False
219
+
220
+ try:
221
+ if os.path.isdir(source):
222
+ # Add all files in directory
223
+ count = 0
224
+ for root, _, files in os.walk(source):
225
+ for file in files:
226
+ file_path = os.path.join(root, file)
227
+ try:
228
+ knowledge.add(file_path)
229
+ count += 1
230
+ except Exception as e:
231
+ if self.verbose:
232
+ self.print_status(f"Skipped {file}: {e}", "warning")
233
+ self.print_status(f"✅ Added {count} files from {source}", "success")
234
+ else:
235
+ knowledge.add(source)
236
+ self.print_status(f"✅ Added: {source}", "success")
237
+ return True
238
+ except Exception as e:
239
+ self.print_status(f"Failed to add: {e}", "error")
240
+ return False
241
+
242
+ def action_search(self, args: List[str], **kwargs) -> List[Dict[str, Any]]:
243
+ """Alias for action_query."""
244
+ return self.action_query(args, **kwargs)
245
+
246
+ def action_query(self, args: List[str], **kwargs) -> List[Dict[str, Any]]:
247
+ """
248
+ Query knowledge base with RAG.
249
+
250
+ Uses configured retrieval strategy, reranker, and query mode.
251
+
252
+ Args:
253
+ args: List containing query
254
+
255
+ Returns:
256
+ List of results with answer and sources
257
+ """
258
+ if not args:
259
+ self.print_status("Usage: praisonai knowledge query <question>", "error")
260
+ return []
261
+
262
+ knowledge = self._get_knowledge()
263
+ if not knowledge:
264
+ return []
265
+
266
+ query = ' '.join(args)
267
+ limit = kwargs.get('limit', 5)
268
+
269
+ try:
270
+ # Use knowledge.search for basic retrieval
271
+ results = knowledge.search(query, limit=limit)
272
+
273
+ if results:
274
+ self.print_status(f"\n🔍 Results for '{query}':\n", "info")
275
+ for i, result in enumerate(results, 1):
276
+ if isinstance(result, dict):
277
+ content = result.get('memory', result.get('text', str(result)))[:200]
278
+ score = result.get('score', 'N/A')
279
+ self.print_status(f" {i}. [score: {score}] {content}...", "info")
280
+ else:
281
+ content = str(result)[:200]
282
+ self.print_status(f" {i}. {content}...", "info")
283
+ else:
284
+ self.print_status("No results found", "warning")
285
+
286
+ return results
287
+ except Exception as e:
288
+ self.print_status(f"Query failed: {e}", "error")
289
+ return []
290
+
291
+ def action_list(self, args: List[str], **kwargs) -> List[str]:
292
+ """
293
+ List indexed documents.
294
+
295
+ Returns:
296
+ List of document names
297
+ """
298
+ knowledge = self._get_knowledge()
299
+ if not knowledge:
300
+ return []
301
+
302
+ try:
303
+ if hasattr(knowledge, 'list_documents'):
304
+ docs = knowledge.list_documents()
305
+ elif hasattr(knowledge, 'documents'):
306
+ docs = list(knowledge.documents.keys()) if knowledge.documents else []
307
+ else:
308
+ docs = []
309
+
310
+ if docs:
311
+ self.print_status("\n📚 Indexed Documents:", "info")
312
+ for doc in docs:
313
+ self.print_status(f" - {doc}", "info")
314
+ else:
315
+ self.print_status("No documents indexed", "warning")
316
+
317
+ return docs
318
+ except Exception as e:
319
+ self.print_status(f"Failed to list documents: {e}", "error")
320
+ return []
321
+
322
+ def action_clear(self, args: List[str], **kwargs) -> bool:
323
+ """
324
+ Clear knowledge base.
325
+
326
+ Returns:
327
+ True if successful
328
+ """
329
+ knowledge = self._get_knowledge()
330
+ if not knowledge:
331
+ return False
332
+
333
+ try:
334
+ if hasattr(knowledge, 'clear'):
335
+ knowledge.clear()
336
+ elif hasattr(knowledge, 'reset'):
337
+ knowledge.reset()
338
+
339
+ self.print_status("✅ Knowledge base cleared", "success")
340
+ return True
341
+ except Exception as e:
342
+ self.print_status(f"Failed to clear: {e}", "error")
343
+ return False
344
+
345
+ def action_stats(self, args: List[str], **kwargs) -> Dict[str, Any]:
346
+ """
347
+ Show knowledge base statistics.
348
+
349
+ Returns:
350
+ Dictionary of statistics
351
+ """
352
+ knowledge = self._get_knowledge()
353
+ if not knowledge:
354
+ return {}
355
+
356
+ stats = {
357
+ "workspace": self.workspace,
358
+ "vector_store": self.vector_store,
359
+ "retrieval_strategy": self.retrieval_strategy,
360
+ "reranker": self.reranker or "none",
361
+ "index_type": self.index_type,
362
+ "query_mode": self.query_mode
363
+ }
364
+
365
+ try:
366
+ # Try to get document count from memory
367
+ if hasattr(knowledge, 'memory'):
368
+ mem = knowledge.memory
369
+ if hasattr(mem, 'get_all'):
370
+ all_docs = mem.get_all()
371
+ stats['document_count'] = len(all_docs) if all_docs else 0
372
+ except Exception:
373
+ pass
374
+
375
+ self.print_status("\n📊 Knowledge Base Statistics:", "info")
376
+ for key, value in stats.items():
377
+ self.print_status(f" {key}: {value}", "info")
378
+
379
+ return stats
380
+
381
+ def action_info(self, args: List[str], **kwargs) -> Dict[str, Any]:
382
+ """Alias for action_stats."""
383
+ return self.action_stats(args, **kwargs)
384
+
385
+ def action_export(self, args: List[str], **kwargs) -> bool:
386
+ """
387
+ Export knowledge base to JSON file.
388
+
389
+ Exports all documents with their metadata, embeddings, and content
390
+ for backup or migration purposes.
391
+
392
+ Args:
393
+ args: List containing output file path
394
+
395
+ Returns:
396
+ True if successful
397
+ """
398
+ import json
399
+ from datetime import datetime
400
+
401
+ if not args:
402
+ # Default filename with timestamp
403
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
404
+ output_file = os.path.join(self.workspace, f"knowledge_export_{timestamp}.json")
405
+ else:
406
+ output_file = args[0]
407
+ if not os.path.isabs(output_file):
408
+ output_file = os.path.join(self.workspace, output_file)
409
+
410
+ knowledge = self._get_knowledge()
411
+ if not knowledge:
412
+ return False
413
+
414
+ try:
415
+ export_data = {
416
+ "version": "1.0",
417
+ "exported_at": datetime.now().isoformat(),
418
+ "workspace": self.workspace,
419
+ "vector_store": self.vector_store,
420
+ "documents": []
421
+ }
422
+
423
+ # Try to get all documents from knowledge/memory
424
+ if hasattr(knowledge, 'memory') and hasattr(knowledge.memory, 'get_all'):
425
+ all_docs = knowledge.memory.get_all()
426
+ if all_docs:
427
+ for doc in all_docs:
428
+ if isinstance(doc, dict):
429
+ export_data["documents"].append(doc)
430
+ else:
431
+ export_data["documents"].append({
432
+ "content": str(doc),
433
+ "metadata": {}
434
+ })
435
+ elif hasattr(knowledge, 'get_all'):
436
+ all_docs = knowledge.get_all()
437
+ if all_docs:
438
+ for doc in all_docs:
439
+ if isinstance(doc, dict):
440
+ export_data["documents"].append(doc)
441
+ else:
442
+ export_data["documents"].append({
443
+ "content": str(doc),
444
+ "metadata": {}
445
+ })
446
+
447
+ # Ensure output directory exists
448
+ os.makedirs(os.path.dirname(output_file) or ".", exist_ok=True)
449
+
450
+ with open(output_file, 'w', encoding='utf-8') as f:
451
+ json.dump(export_data, f, indent=2, default=str)
452
+
453
+ doc_count = len(export_data["documents"])
454
+ self.print_status(f"✅ Exported {doc_count} documents to {output_file}", "success")
455
+ return True
456
+
457
+ except Exception as e:
458
+ self.print_status(f"Export failed: {e}", "error")
459
+ return False
460
+
461
+ def action_import(self, args: List[str], **kwargs) -> bool:
462
+ """
463
+ Import knowledge base from JSON file.
464
+
465
+ Imports documents from a previously exported JSON file.
466
+
467
+ Args:
468
+ args: List containing input file path
469
+
470
+ Returns:
471
+ True if successful
472
+ """
473
+ import json
474
+
475
+ if not args:
476
+ self.print_status("Usage: praisonai knowledge import <file.json>", "error")
477
+ return False
478
+
479
+ input_file = args[0]
480
+ if not os.path.isabs(input_file):
481
+ input_file = os.path.join(self.workspace, input_file)
482
+
483
+ if not os.path.exists(input_file):
484
+ self.print_status(f"File not found: {input_file}", "error")
485
+ return False
486
+
487
+ knowledge = self._get_knowledge()
488
+ if not knowledge:
489
+ return False
490
+
491
+ try:
492
+ with open(input_file, 'r', encoding='utf-8') as f:
493
+ import_data = json.load(f)
494
+
495
+ # version field reserved for future schema migrations
496
+ _ = import_data.get("version", "unknown")
497
+ documents = import_data.get("documents", [])
498
+
499
+ if not documents:
500
+ self.print_status("No documents found in import file", "warning")
501
+ return True
502
+
503
+ imported_count = 0
504
+ for doc in documents:
505
+ try:
506
+ content = doc.get("content") or doc.get("memory") or doc.get("text", "")
507
+ metadata = doc.get("metadata", {})
508
+
509
+ if content:
510
+ if hasattr(knowledge, 'store'):
511
+ knowledge.store(content, metadata=metadata)
512
+ elif hasattr(knowledge, 'add'):
513
+ knowledge.add(content, metadata=metadata)
514
+ imported_count += 1
515
+ except Exception as e:
516
+ if self.verbose:
517
+ self.print_status(f"Skipped document: {e}", "warning")
518
+
519
+ self.print_status(f"✅ Imported {imported_count} documents from {input_file}", "success")
520
+ return True
521
+
522
+ except json.JSONDecodeError as e:
523
+ self.print_status(f"Invalid JSON file: {e}", "error")
524
+ return False
525
+ except Exception as e:
526
+ self.print_status(f"Import failed: {e}", "error")
527
+ return False
528
+
529
+ def execute(self, action: str, action_args: List[str], **kwargs) -> Any:
530
+ """Execute knowledge command action."""
531
+ return super().execute(action, action_args, **kwargs)