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,256 @@
1
+ """
2
+ LlamaIndex VectorStore adapter implementation of KnowledgeStore.
3
+
4
+ Wraps any LlamaIndex VectorStore for use with PraisonAI.
5
+
6
+ Requires: llama-index-core
7
+ Install: pip install llama-index-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 LlamaIndexKnowledgeStore(KnowledgeStore):
19
+ """
20
+ LlamaIndex VectorStore adapter for knowledge/RAG.
21
+
22
+ Wraps any LlamaIndex VectorStore for use with PraisonAI's interface.
23
+
24
+ Example:
25
+ from llama_index.vector_stores.chroma import ChromaVectorStore
26
+
27
+ li_store = ChromaVectorStore(chroma_collection=collection)
28
+ store = LlamaIndexKnowledgeStore(vector_store=li_store)
29
+ """
30
+
31
+ def __init__(
32
+ self,
33
+ vector_store: Any = None,
34
+ vector_store_cls: Optional[str] = None,
35
+ vector_store_kwargs: Optional[Dict[str, Any]] = None,
36
+ ):
37
+ """
38
+ Initialize LlamaIndex adapter.
39
+
40
+ Args:
41
+ vector_store: Pre-initialized LlamaIndex VectorStore instance
42
+ vector_store_cls: Class name to import (e.g., "llama_index.vector_stores.chroma.ChromaVectorStore")
43
+ vector_store_kwargs: Kwargs for vector_store initialization
44
+ """
45
+ self._vector_store = vector_store
46
+ self._vector_store_cls = vector_store_cls
47
+ self._vector_store_kwargs = vector_store_kwargs or {}
48
+ self._initialized = vector_store is not None
49
+
50
+ def _init_client(self):
51
+ """Initialize vector store lazily."""
52
+ if self._initialized:
53
+ return
54
+
55
+ if not self._vector_store_cls:
56
+ raise ValueError(
57
+ "Either vector_store or vector_store_cls must be provided"
58
+ )
59
+
60
+ # Dynamic import of vector store class
61
+ parts = self._vector_store_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._vector_store = cls(**self._vector_store_kwargs)
68
+ else:
69
+ raise ValueError(f"Invalid vector_store_cls: {self._vector_store_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 vector store)."""
81
+ self._init_client()
82
+ logger.info("Collection creation handled by LlamaIndex vector store")
83
+
84
+ def delete_collection(self, name: str) -> bool:
85
+ """Delete collection."""
86
+ self._init_client()
87
+ try:
88
+ if hasattr(self._vector_store, 'delete'):
89
+ self._vector_store.delete(delete_all=True)
90
+ return True
91
+ logger.warning("Underlying vector store doesn't support delete")
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._vector_store is not None
101
+
102
+ def list_collections(self) -> List[str]:
103
+ """List collections."""
104
+ self._init_client()
105
+ return ["default"]
106
+
107
+ def insert(
108
+ self,
109
+ collection: str,
110
+ documents: List[KnowledgeDocument]
111
+ ) -> List[str]:
112
+ """Insert documents."""
113
+ self._init_client()
114
+
115
+ try:
116
+ from llama_index.core.schema import TextNode
117
+ except ImportError:
118
+ raise ImportError(
119
+ "llama-index-core is required. Install with: pip install llama-index-core"
120
+ )
121
+
122
+ nodes = []
123
+ ids = []
124
+ for doc in documents:
125
+ node = TextNode(
126
+ text=doc.content,
127
+ id_=doc.id,
128
+ metadata={
129
+ **(doc.metadata or {}),
130
+ "content_hash": doc.content_hash,
131
+ "created_at": doc.created_at,
132
+ },
133
+ embedding=doc.embedding
134
+ )
135
+ nodes.append(node)
136
+ ids.append(doc.id)
137
+
138
+ if hasattr(self._vector_store, 'add'):
139
+ self._vector_store.add(nodes)
140
+ else:
141
+ logger.warning("Vector store doesn't support add")
142
+
143
+ return ids
144
+
145
+ def upsert(
146
+ self,
147
+ collection: str,
148
+ documents: List[KnowledgeDocument]
149
+ ) -> List[str]:
150
+ """Upsert documents."""
151
+ return self.insert(collection, documents)
152
+
153
+ def search(
154
+ self,
155
+ collection: str,
156
+ query_embedding: List[float],
157
+ limit: int = 5,
158
+ filters: Optional[Dict[str, Any]] = None,
159
+ score_threshold: Optional[float] = None
160
+ ) -> List[KnowledgeDocument]:
161
+ """Search for similar documents."""
162
+ self._init_client()
163
+
164
+ try:
165
+ from llama_index.core.vector_stores import VectorStoreQuery
166
+ except ImportError:
167
+ raise ImportError(
168
+ "llama-index-core is required. Install with: pip install llama-index-core"
169
+ )
170
+
171
+ try:
172
+ query = VectorStoreQuery(
173
+ query_embedding=query_embedding,
174
+ similarity_top_k=limit,
175
+ )
176
+
177
+ result = self._vector_store.query(query)
178
+
179
+ documents = []
180
+ for i, node in enumerate(result.nodes or []):
181
+ score = result.similarities[i] if result.similarities else None
182
+ if score_threshold and score and score < score_threshold:
183
+ continue
184
+
185
+ metadata = node.metadata or {}
186
+ if score:
187
+ metadata["score"] = score
188
+
189
+ documents.append(KnowledgeDocument(
190
+ id=node.node_id or node.id_,
191
+ content=node.text or node.get_content(),
192
+ embedding=node.embedding,
193
+ metadata=metadata,
194
+ content_hash=metadata.get("content_hash"),
195
+ created_at=metadata.get("created_at", 0)
196
+ ))
197
+
198
+ return documents
199
+ except Exception as e:
200
+ logger.error(f"Search failed: {e}")
201
+ return []
202
+
203
+ def get(
204
+ self,
205
+ collection: str,
206
+ ids: List[str]
207
+ ) -> List[KnowledgeDocument]:
208
+ """Get documents by IDs."""
209
+ self._init_client()
210
+
211
+ documents = []
212
+ for doc_id in ids:
213
+ try:
214
+ if hasattr(self._vector_store, 'get'):
215
+ node = self._vector_store.get(doc_id)
216
+ if node:
217
+ metadata = node.metadata or {}
218
+ documents.append(KnowledgeDocument(
219
+ id=node.node_id or node.id_,
220
+ content=node.text or node.get_content(),
221
+ embedding=node.embedding,
222
+ metadata=metadata
223
+ ))
224
+ except Exception as e:
225
+ logger.warning(f"Get by ID failed for {doc_id}: {e}")
226
+
227
+ return documents
228
+
229
+ def delete(
230
+ self,
231
+ collection: str,
232
+ ids: Optional[List[str]] = None,
233
+ filters: Optional[Dict[str, Any]] = None
234
+ ) -> int:
235
+ """Delete documents."""
236
+ self._init_client()
237
+
238
+ if ids and hasattr(self._vector_store, 'delete'):
239
+ try:
240
+ self._vector_store.delete(ref_doc_id=ids[0] if len(ids) == 1 else None)
241
+ return len(ids)
242
+ except Exception as e:
243
+ logger.error(f"Delete failed: {e}")
244
+
245
+ return 0
246
+
247
+ def count(self, collection: str) -> int:
248
+ """Count documents."""
249
+ self._init_client()
250
+ logger.warning("LlamaIndex vector stores don't typically support counting")
251
+ return -1
252
+
253
+ def close(self) -> None:
254
+ """Close the client."""
255
+ self._vector_store = None
256
+ self._initialized = False
@@ -0,0 +1,277 @@
1
+ """
2
+ Milvus implementation of KnowledgeStore.
3
+
4
+ Requires: pymilvus
5
+ Install: pip install pymilvus
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 MilvusKnowledgeStore(KnowledgeStore):
17
+ """
18
+ Milvus-based knowledge store for vector search.
19
+
20
+ Example:
21
+ store = MilvusKnowledgeStore(
22
+ host="localhost",
23
+ port=19530
24
+ )
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ url: Optional[str] = None,
30
+ host: str = "localhost",
31
+ port: int = 19530,
32
+ token: Optional[str] = None,
33
+ db_name: str = "default",
34
+ ):
35
+ try:
36
+ from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility
37
+ except ImportError:
38
+ raise ImportError(
39
+ "pymilvus is required for Milvus support. "
40
+ "Install with: pip install pymilvus"
41
+ )
42
+
43
+ self._pymilvus = {
44
+ "connections": connections,
45
+ "Collection": Collection,
46
+ "FieldSchema": FieldSchema,
47
+ "CollectionSchema": CollectionSchema,
48
+ "DataType": DataType,
49
+ "utility": utility,
50
+ }
51
+
52
+ if url:
53
+ # Parse milvus://host:port
54
+ from urllib.parse import urlparse
55
+ parsed = urlparse(url)
56
+ host = parsed.hostname or host
57
+ port = parsed.port or port
58
+
59
+ connections.connect(
60
+ alias="default",
61
+ host=host,
62
+ port=port,
63
+ token=token,
64
+ db_name=db_name,
65
+ )
66
+ logger.info(f"Connected to Milvus at {host}:{port}")
67
+
68
+ def create_collection(
69
+ self,
70
+ name: str,
71
+ dimension: int,
72
+ distance: str = "cosine",
73
+ metadata: Optional[Dict[str, Any]] = None
74
+ ) -> None:
75
+ """Create a new collection."""
76
+ FieldSchema = self._pymilvus["FieldSchema"]
77
+ CollectionSchema = self._pymilvus["CollectionSchema"]
78
+ DataType = self._pymilvus["DataType"]
79
+ Collection = self._pymilvus["Collection"]
80
+
81
+ fields = [
82
+ FieldSchema(name="id", dtype=DataType.VARCHAR, is_primary=True, max_length=256),
83
+ FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535),
84
+ FieldSchema(name="content_hash", dtype=DataType.VARCHAR, max_length=64),
85
+ FieldSchema(name="created_at", dtype=DataType.DOUBLE),
86
+ FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dimension),
87
+ ]
88
+
89
+ schema = CollectionSchema(fields=fields, description="PraisonAI knowledge store")
90
+ collection = Collection(name=name, schema=schema)
91
+
92
+ # Create index
93
+ metric_map = {"cosine": "COSINE", "euclidean": "L2", "dot": "IP"}
94
+ index_params = {
95
+ "metric_type": metric_map.get(distance, "COSINE"),
96
+ "index_type": "HNSW",
97
+ "params": {"M": 16, "efConstruction": 256}
98
+ }
99
+ collection.create_index(field_name="vector", index_params=index_params)
100
+ logger.info(f"Created Milvus collection: {name}")
101
+
102
+ def delete_collection(self, name: str) -> bool:
103
+ """Delete a collection."""
104
+ utility = self._pymilvus["utility"]
105
+ try:
106
+ utility.drop_collection(name)
107
+ return True
108
+ except Exception as e:
109
+ logger.warning(f"Failed to delete collection {name}: {e}")
110
+ return False
111
+
112
+ def collection_exists(self, name: str) -> bool:
113
+ """Check if a collection exists."""
114
+ utility = self._pymilvus["utility"]
115
+ return utility.has_collection(name)
116
+
117
+ def list_collections(self) -> List[str]:
118
+ """List all collections."""
119
+ utility = self._pymilvus["utility"]
120
+ return utility.list_collections()
121
+
122
+ def insert(
123
+ self,
124
+ collection: str,
125
+ documents: List[KnowledgeDocument]
126
+ ) -> List[str]:
127
+ """Insert documents."""
128
+ Collection = self._pymilvus["Collection"]
129
+ col = Collection(collection)
130
+ col.load()
131
+
132
+ data = [
133
+ [doc.id for doc in documents],
134
+ [doc.content for doc in documents],
135
+ [doc.content_hash or "" for doc in documents],
136
+ [doc.created_at for doc in documents],
137
+ [doc.embedding for doc in documents],
138
+ ]
139
+
140
+ col.insert(data)
141
+ col.flush()
142
+ return [doc.id for doc in documents]
143
+
144
+ def upsert(
145
+ self,
146
+ collection: str,
147
+ documents: List[KnowledgeDocument]
148
+ ) -> List[str]:
149
+ """Insert or update documents."""
150
+ Collection = self._pymilvus["Collection"]
151
+ col = Collection(collection)
152
+ col.load()
153
+
154
+ data = [
155
+ [doc.id for doc in documents],
156
+ [doc.content for doc in documents],
157
+ [doc.content_hash or "" for doc in documents],
158
+ [doc.created_at for doc in documents],
159
+ [doc.embedding for doc in documents],
160
+ ]
161
+
162
+ col.upsert(data)
163
+ col.flush()
164
+ return [doc.id for doc in documents]
165
+
166
+ def search(
167
+ self,
168
+ collection: str,
169
+ query_embedding: List[float],
170
+ limit: int = 5,
171
+ filters: Optional[Dict[str, Any]] = None,
172
+ score_threshold: Optional[float] = None
173
+ ) -> List[KnowledgeDocument]:
174
+ """Search for similar documents."""
175
+ Collection = self._pymilvus["Collection"]
176
+ col = Collection(collection)
177
+ col.load()
178
+
179
+ search_params = {"metric_type": "COSINE", "params": {"ef": 64}}
180
+
181
+ expr = None
182
+ if filters:
183
+ conditions = [f'{k} == "{v}"' for k, v in filters.items()]
184
+ expr = " and ".join(conditions)
185
+
186
+ results = col.search(
187
+ data=[query_embedding],
188
+ anns_field="vector",
189
+ param=search_params,
190
+ limit=limit,
191
+ expr=expr,
192
+ output_fields=["id", "content", "content_hash", "created_at"],
193
+ )
194
+
195
+ documents = []
196
+ for hits in results:
197
+ for hit in hits:
198
+ if score_threshold and hit.score < score_threshold:
199
+ continue
200
+
201
+ doc = KnowledgeDocument(
202
+ id=hit.entity.get("id"),
203
+ content=hit.entity.get("content", ""),
204
+ embedding=None,
205
+ metadata={},
206
+ content_hash=hit.entity.get("content_hash"),
207
+ created_at=hit.entity.get("created_at", 0),
208
+ )
209
+ documents.append(doc)
210
+
211
+ return documents
212
+
213
+ def get(
214
+ self,
215
+ collection: str,
216
+ ids: List[str]
217
+ ) -> List[KnowledgeDocument]:
218
+ """Get documents by IDs."""
219
+ Collection = self._pymilvus["Collection"]
220
+ col = Collection(collection)
221
+ col.load()
222
+
223
+ id_list = ", ".join([f'"{i}"' for i in ids])
224
+ expr = f"id in [{id_list}]"
225
+
226
+ results = col.query(
227
+ expr=expr,
228
+ output_fields=["id", "content", "content_hash", "created_at", "vector"],
229
+ )
230
+
231
+ documents = []
232
+ for row in results:
233
+ doc = KnowledgeDocument(
234
+ id=row["id"],
235
+ content=row.get("content", ""),
236
+ embedding=row.get("vector"),
237
+ metadata={},
238
+ content_hash=row.get("content_hash"),
239
+ created_at=row.get("created_at", 0),
240
+ )
241
+ documents.append(doc)
242
+
243
+ return documents
244
+
245
+ def delete(
246
+ self,
247
+ collection: str,
248
+ ids: Optional[List[str]] = None,
249
+ filters: Optional[Dict[str, Any]] = None
250
+ ) -> int:
251
+ """Delete documents."""
252
+ Collection = self._pymilvus["Collection"]
253
+ col = Collection(collection)
254
+ col.load()
255
+
256
+ if ids:
257
+ id_list = ", ".join([f'"{i}"' for i in ids])
258
+ expr = f"id in [{id_list}]"
259
+ col.delete(expr)
260
+ return len(ids)
261
+ elif filters:
262
+ conditions = [f'{k} == "{v}"' for k, v in filters.items()]
263
+ expr = " and ".join(conditions)
264
+ col.delete(expr)
265
+ return -1
266
+ return 0
267
+
268
+ def count(self, collection: str) -> int:
269
+ """Count documents."""
270
+ Collection = self._pymilvus["Collection"]
271
+ col = Collection(collection)
272
+ return col.num_entities
273
+
274
+ def close(self) -> None:
275
+ """Close the store."""
276
+ connections = self._pymilvus["connections"]
277
+ connections.disconnect("default")