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,291 @@
1
+ """
2
+ LangChain VectorStore adapter implementation of KnowledgeStore.
3
+
4
+ Wraps any LangChain VectorStore for use with PraisonAI.
5
+
6
+ Requires: langchain-core
7
+ Install: pip install langchain-core
8
+ """
9
+
10
+ import logging
11
+ from typing import Any, Dict, List, Optional
12
+
13
+ from .base import KnowledgeStore, KnowledgeDocument
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class LangChainKnowledgeStore(KnowledgeStore):
19
+ """
20
+ LangChain VectorStore adapter for knowledge/RAG.
21
+
22
+ Wraps any LangChain VectorStore for use with PraisonAI's interface.
23
+
24
+ Example:
25
+ from langchain_chroma import Chroma
26
+
27
+ lc_store = Chroma(persist_directory="./chroma_db")
28
+ store = LangChainKnowledgeStore(vectorstore=lc_store)
29
+ """
30
+
31
+ def __init__(
32
+ self,
33
+ vectorstore: Any = None,
34
+ vectorstore_cls: Optional[str] = None,
35
+ vectorstore_kwargs: Optional[Dict[str, Any]] = None,
36
+ ):
37
+ """
38
+ Initialize LangChain adapter.
39
+
40
+ Args:
41
+ vectorstore: Pre-initialized LangChain VectorStore instance
42
+ vectorstore_cls: Class name to import (e.g., "langchain_chroma.Chroma")
43
+ vectorstore_kwargs: Kwargs for vectorstore initialization
44
+ """
45
+ self._vectorstore = vectorstore
46
+ self._vectorstore_cls = vectorstore_cls
47
+ self._vectorstore_kwargs = vectorstore_kwargs or {}
48
+ self._initialized = vectorstore is not None
49
+
50
+ def _init_client(self):
51
+ """Initialize vectorstore lazily."""
52
+ if self._initialized:
53
+ return
54
+
55
+ if not self._vectorstore_cls:
56
+ raise ValueError(
57
+ "Either vectorstore or vectorstore_cls must be provided"
58
+ )
59
+
60
+ # Dynamic import of vectorstore class
61
+ parts = self._vectorstore_cls.rsplit(".", 1)
62
+ if len(parts) == 2:
63
+ module_name, class_name = parts
64
+ import importlib
65
+ module = importlib.import_module(module_name)
66
+ cls = getattr(module, class_name)
67
+ self._vectorstore = cls(**self._vectorstore_kwargs)
68
+ else:
69
+ raise ValueError(f"Invalid vectorstore_cls: {self._vectorstore_cls}")
70
+
71
+ self._initialized = True
72
+
73
+ def create_collection(
74
+ self,
75
+ name: str,
76
+ dimension: int = 1536,
77
+ distance: str = "cosine",
78
+ metadata: Optional[Dict[str, Any]] = None
79
+ ) -> None:
80
+ """Create collection (handled by underlying vectorstore)."""
81
+ self._init_client()
82
+ logger.info(f"Collection creation handled by LangChain vectorstore")
83
+
84
+ def delete_collection(self, name: str) -> bool:
85
+ """Delete collection."""
86
+ self._init_client()
87
+ try:
88
+ if hasattr(self._vectorstore, 'delete_collection'):
89
+ self._vectorstore.delete_collection()
90
+ return True
91
+ logger.warning("Underlying vectorstore doesn't support delete_collection")
92
+ return False
93
+ except Exception as e:
94
+ logger.error(f"Failed to delete collection: {e}")
95
+ return False
96
+
97
+ def collection_exists(self, name: str) -> bool:
98
+ """Check if collection exists."""
99
+ self._init_client()
100
+ return self._vectorstore is not None
101
+
102
+ def list_collections(self) -> List[str]:
103
+ """List collections."""
104
+ self._init_client()
105
+ if hasattr(self._vectorstore, 'list_collections'):
106
+ return self._vectorstore.list_collections()
107
+ return ["default"]
108
+
109
+ def insert(
110
+ self,
111
+ collection: str,
112
+ documents: List[KnowledgeDocument]
113
+ ) -> List[str]:
114
+ """Insert documents."""
115
+ self._init_client()
116
+
117
+ try:
118
+ from langchain_core.documents import Document as LCDocument
119
+ except ImportError:
120
+ raise ImportError(
121
+ "langchain-core is required. Install with: pip install langchain-core"
122
+ )
123
+
124
+ lc_docs = []
125
+ ids = []
126
+ for doc in documents:
127
+ lc_doc = LCDocument(
128
+ page_content=doc.content,
129
+ metadata={
130
+ **(doc.metadata or {}),
131
+ "id": doc.id,
132
+ "content_hash": doc.content_hash,
133
+ "created_at": doc.created_at,
134
+ }
135
+ )
136
+ lc_docs.append(lc_doc)
137
+ ids.append(doc.id)
138
+
139
+ if hasattr(self._vectorstore, 'add_documents'):
140
+ self._vectorstore.add_documents(lc_docs, ids=ids)
141
+ else:
142
+ logger.warning("Vectorstore doesn't support add_documents")
143
+
144
+ return ids
145
+
146
+ def upsert(
147
+ self,
148
+ collection: str,
149
+ documents: List[KnowledgeDocument]
150
+ ) -> List[str]:
151
+ """Upsert documents."""
152
+ # Most LangChain vectorstores handle upsert via add_documents
153
+ return self.insert(collection, documents)
154
+
155
+ def search(
156
+ self,
157
+ collection: str,
158
+ query_embedding: List[float],
159
+ limit: int = 5,
160
+ filters: Optional[Dict[str, Any]] = None,
161
+ score_threshold: Optional[float] = None
162
+ ) -> List[KnowledgeDocument]:
163
+ """Search for similar documents."""
164
+ self._init_client()
165
+
166
+ try:
167
+ if hasattr(self._vectorstore, 'similarity_search_by_vector'):
168
+ results = self._vectorstore.similarity_search_by_vector(
169
+ query_embedding,
170
+ k=limit,
171
+ filter=filters
172
+ )
173
+ else:
174
+ logger.warning("Vectorstore doesn't support vector search")
175
+ return []
176
+
177
+ documents = []
178
+ for lc_doc in results:
179
+ metadata = lc_doc.metadata or {}
180
+ documents.append(KnowledgeDocument(
181
+ id=metadata.get("id", ""),
182
+ content=lc_doc.page_content,
183
+ metadata=metadata,
184
+ content_hash=metadata.get("content_hash"),
185
+ created_at=metadata.get("created_at", 0)
186
+ ))
187
+
188
+ return documents
189
+ except Exception as e:
190
+ logger.error(f"Search failed: {e}")
191
+ return []
192
+
193
+ def similarity_search(
194
+ self,
195
+ query_text: str,
196
+ limit: int = 5,
197
+ filters: Optional[Dict[str, Any]] = None
198
+ ) -> List[KnowledgeDocument]:
199
+ """
200
+ Text-based similarity search (native LangChain method).
201
+
202
+ Args:
203
+ query_text: Query string
204
+ limit: Maximum results
205
+ filters: Metadata filters
206
+
207
+ Returns:
208
+ List of matching documents
209
+ """
210
+ self._init_client()
211
+
212
+ try:
213
+ results = self._vectorstore.similarity_search(
214
+ query_text,
215
+ k=limit,
216
+ filter=filters
217
+ )
218
+
219
+ documents = []
220
+ for lc_doc in results:
221
+ metadata = lc_doc.metadata or {}
222
+ documents.append(KnowledgeDocument(
223
+ id=metadata.get("id", ""),
224
+ content=lc_doc.page_content,
225
+ metadata=metadata,
226
+ content_hash=metadata.get("content_hash"),
227
+ created_at=metadata.get("created_at", 0)
228
+ ))
229
+
230
+ return documents
231
+ except Exception as e:
232
+ logger.error(f"Similarity search failed: {e}")
233
+ return []
234
+
235
+ def get(
236
+ self,
237
+ collection: str,
238
+ ids: List[str]
239
+ ) -> List[KnowledgeDocument]:
240
+ """Get documents by IDs."""
241
+ self._init_client()
242
+
243
+ if hasattr(self._vectorstore, 'get'):
244
+ try:
245
+ results = self._vectorstore.get(ids)
246
+ documents = []
247
+ for lc_doc in results:
248
+ metadata = lc_doc.metadata or {}
249
+ documents.append(KnowledgeDocument(
250
+ id=metadata.get("id", ""),
251
+ content=lc_doc.page_content,
252
+ metadata=metadata
253
+ ))
254
+ return documents
255
+ except Exception as e:
256
+ logger.warning(f"Get by ID failed: {e}")
257
+
258
+ return []
259
+
260
+ def delete(
261
+ self,
262
+ collection: str,
263
+ ids: Optional[List[str]] = None,
264
+ filters: Optional[Dict[str, Any]] = None
265
+ ) -> int:
266
+ """Delete documents."""
267
+ self._init_client()
268
+
269
+ if ids and hasattr(self._vectorstore, 'delete'):
270
+ try:
271
+ self._vectorstore.delete(ids)
272
+ return len(ids)
273
+ except Exception as e:
274
+ logger.error(f"Delete failed: {e}")
275
+
276
+ return 0
277
+
278
+ def count(self, collection: str) -> int:
279
+ """Count documents."""
280
+ self._init_client()
281
+
282
+ if hasattr(self._vectorstore, '__len__'):
283
+ return len(self._vectorstore)
284
+
285
+ logger.warning("Vectorstore doesn't support counting")
286
+ return -1
287
+
288
+ def close(self) -> None:
289
+ """Close the client."""
290
+ self._vectorstore = None
291
+ self._initialized = False
@@ -0,0 +1,212 @@
1
+ """
2
+ LightRAG adapter implementation of KnowledgeStore.
3
+
4
+ Requires: lightrag
5
+ Install: pip install lightrag
6
+ """
7
+
8
+ import logging
9
+ from typing import Any, Dict, List, Optional
10
+
11
+ from .base import KnowledgeStore, KnowledgeDocument
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class LightRAGKnowledgeStore(KnowledgeStore):
17
+ """
18
+ LightRAG adapter for knowledge/RAG.
19
+
20
+ Wraps LightRAG for use with PraisonAI's KnowledgeStore interface.
21
+
22
+ Example:
23
+ store = LightRAGKnowledgeStore(
24
+ working_dir="./lightrag_data"
25
+ )
26
+ """
27
+
28
+ def __init__(
29
+ self,
30
+ working_dir: str = "./lightrag_data",
31
+ llm_model: str = "gpt-4o-mini",
32
+ embedding_model: str = "text-embedding-3-small",
33
+ **kwargs
34
+ ):
35
+ """
36
+ Initialize LightRAG adapter.
37
+
38
+ Args:
39
+ working_dir: Directory for LightRAG data
40
+ llm_model: LLM model for graph extraction
41
+ embedding_model: Embedding model name
42
+ **kwargs: Additional LightRAG options
43
+ """
44
+ self.working_dir = working_dir
45
+ self.llm_model = llm_model
46
+ self.embedding_model = embedding_model
47
+ self.kwargs = kwargs
48
+
49
+ self._rag = None
50
+ self._initialized = False
51
+
52
+ def _init_client(self):
53
+ """Initialize LightRAG client lazily."""
54
+ if self._initialized:
55
+ return
56
+
57
+ try:
58
+ from lightrag import LightRAG, QueryParam
59
+ from lightrag.llm import gpt_4o_mini_complete, openai_embedding
60
+ except ImportError:
61
+ raise ImportError(
62
+ "lightrag is required for LightRAG support. "
63
+ "Install with: pip install lightrag"
64
+ )
65
+
66
+ self._QueryParam = QueryParam
67
+ self._rag = LightRAG(
68
+ working_dir=self.working_dir,
69
+ llm_model_func=gpt_4o_mini_complete,
70
+ embedding_func=openai_embedding,
71
+ **self.kwargs
72
+ )
73
+ self._initialized = True
74
+
75
+ def create_collection(
76
+ self,
77
+ name: str,
78
+ dimension: int = 1536,
79
+ distance: str = "cosine",
80
+ metadata: Optional[Dict[str, Any]] = None
81
+ ) -> None:
82
+ """Create collection (LightRAG uses working directory)."""
83
+ self._init_client()
84
+ logger.info(f"LightRAG uses working_dir: {self.working_dir}")
85
+
86
+ def delete_collection(self, name: str) -> bool:
87
+ """Delete collection data."""
88
+ import shutil
89
+ import os
90
+
91
+ try:
92
+ if os.path.exists(self.working_dir):
93
+ shutil.rmtree(self.working_dir)
94
+ return True
95
+ except Exception as e:
96
+ logger.error(f"Failed to delete collection: {e}")
97
+ return False
98
+
99
+ def collection_exists(self, name: str) -> bool:
100
+ """Check if working directory exists."""
101
+ import os
102
+ return os.path.exists(self.working_dir)
103
+
104
+ def list_collections(self) -> List[str]:
105
+ """List collections (single collection per working_dir)."""
106
+ import os
107
+ if os.path.exists(self.working_dir):
108
+ return ["default"]
109
+ return []
110
+
111
+ def insert(
112
+ self,
113
+ collection: str,
114
+ documents: List[KnowledgeDocument]
115
+ ) -> List[str]:
116
+ """Insert documents into LightRAG."""
117
+ self._init_client()
118
+
119
+ ids = []
120
+ for doc in documents:
121
+ try:
122
+ self._rag.insert(doc.content)
123
+ ids.append(doc.id)
124
+ except Exception as e:
125
+ logger.warning(f"Failed to insert document {doc.id}: {e}")
126
+
127
+ return ids
128
+
129
+ def upsert(
130
+ self,
131
+ collection: str,
132
+ documents: List[KnowledgeDocument]
133
+ ) -> List[str]:
134
+ """Upsert documents (same as insert for LightRAG)."""
135
+ return self.insert(collection, documents)
136
+
137
+ def search(
138
+ self,
139
+ collection: str,
140
+ query_embedding: List[float],
141
+ limit: int = 5,
142
+ filters: Optional[Dict[str, Any]] = None,
143
+ score_threshold: Optional[float] = None
144
+ ) -> List[KnowledgeDocument]:
145
+ """Search using LightRAG's query method."""
146
+ self._init_client()
147
+
148
+ # LightRAG uses text query, not embeddings directly
149
+ # This is a limitation - we need the original query text
150
+ logger.warning(
151
+ "LightRAG search requires text query, not embeddings. "
152
+ "Use query() method directly for best results."
153
+ )
154
+ return []
155
+
156
+ def query(
157
+ self,
158
+ query_text: str,
159
+ mode: str = "hybrid",
160
+ limit: int = 5
161
+ ) -> str:
162
+ """
163
+ Query LightRAG with text (native method).
164
+
165
+ Args:
166
+ query_text: The query string
167
+ mode: Query mode (naive, local, global, hybrid)
168
+ limit: Maximum results
169
+
170
+ Returns:
171
+ Query response as string
172
+ """
173
+ self._init_client()
174
+
175
+ try:
176
+ result = self._rag.query(
177
+ query_text,
178
+ param=self._QueryParam(mode=mode, top_k=limit)
179
+ )
180
+ return result
181
+ except Exception as e:
182
+ logger.error(f"Query failed: {e}")
183
+ return ""
184
+
185
+ def get(
186
+ self,
187
+ collection: str,
188
+ ids: List[str]
189
+ ) -> List[KnowledgeDocument]:
190
+ """Get documents by IDs (not supported by LightRAG)."""
191
+ logger.warning("LightRAG does not support get by ID")
192
+ return []
193
+
194
+ def delete(
195
+ self,
196
+ collection: str,
197
+ ids: Optional[List[str]] = None,
198
+ filters: Optional[Dict[str, Any]] = None
199
+ ) -> int:
200
+ """Delete documents (not directly supported)."""
201
+ logger.warning("LightRAG does not support individual document deletion")
202
+ return 0
203
+
204
+ def count(self, collection: str) -> int:
205
+ """Count documents (not directly supported)."""
206
+ logger.warning("LightRAG does not support document counting")
207
+ return -1
208
+
209
+ def close(self) -> None:
210
+ """Close the client."""
211
+ self._rag = None
212
+ self._initialized = False