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,409 @@
1
+ """
2
+ Vector Store Adapters for PraisonAI.
3
+
4
+ Provides concrete implementations of VectorStoreProtocol:
5
+ - ChromaVectorStore: Uses ChromaDB
6
+ - PineconeVectorStore: Uses Pinecone
7
+ - QdrantVectorStore: Uses Qdrant
8
+ - WeaviateVectorStore: Uses Weaviate
9
+ """
10
+
11
+ import os
12
+ import logging
13
+ from typing import Any, Dict, List, Optional
14
+ import uuid as uuid_module
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ # Lazy import flags
19
+ _CHROMA_AVAILABLE = None
20
+ _PINECONE_AVAILABLE = None
21
+ _QDRANT_AVAILABLE = None
22
+ _WEAVIATE_AVAILABLE = None
23
+
24
+
25
+ def _check_chroma():
26
+ """Check if chromadb is available."""
27
+ global _CHROMA_AVAILABLE
28
+ if _CHROMA_AVAILABLE is None:
29
+ import importlib.util
30
+ _CHROMA_AVAILABLE = importlib.util.find_spec("chromadb") is not None
31
+ return _CHROMA_AVAILABLE
32
+
33
+
34
+ def _check_pinecone():
35
+ """Check if pinecone is available."""
36
+ global _PINECONE_AVAILABLE
37
+ if _PINECONE_AVAILABLE is None:
38
+ import importlib.util
39
+ _PINECONE_AVAILABLE = importlib.util.find_spec("pinecone") is not None
40
+ return _PINECONE_AVAILABLE
41
+
42
+
43
+ def _check_qdrant():
44
+ """Check if qdrant_client is available."""
45
+ global _QDRANT_AVAILABLE
46
+ if _QDRANT_AVAILABLE is None:
47
+ import importlib.util
48
+ _QDRANT_AVAILABLE = importlib.util.find_spec("qdrant_client") is not None
49
+ return _QDRANT_AVAILABLE
50
+
51
+
52
+ def _check_weaviate():
53
+ """Check if weaviate is available."""
54
+ global _WEAVIATE_AVAILABLE
55
+ if _WEAVIATE_AVAILABLE is None:
56
+ import importlib.util
57
+ _WEAVIATE_AVAILABLE = importlib.util.find_spec("weaviate") is not None
58
+ return _WEAVIATE_AVAILABLE
59
+
60
+
61
+ class ChromaVectorStore:
62
+ """ChromaDB vector store adapter."""
63
+
64
+ name: str = "chroma"
65
+
66
+ def __init__(
67
+ self,
68
+ config: Optional[Dict[str, Any]] = None,
69
+ namespace: Optional[str] = None,
70
+ persist_directory: Optional[str] = None
71
+ ):
72
+ if not _check_chroma():
73
+ raise ImportError(
74
+ "chromadb is required for ChromaVectorStore. "
75
+ "Install with: pip install chromadb"
76
+ )
77
+
78
+ import chromadb
79
+ from chromadb.config import Settings
80
+
81
+ self.config = config or {}
82
+ self.namespace = namespace or "default"
83
+ self.persist_directory = persist_directory or self.config.get("path", ".praison/chroma")
84
+
85
+ # Disable telemetry
86
+ os.environ['ANONYMIZED_TELEMETRY'] = 'False'
87
+
88
+ # Create client
89
+ self._client = chromadb.PersistentClient(
90
+ path=self.persist_directory,
91
+ settings=Settings(anonymized_telemetry=False)
92
+ )
93
+
94
+ # Get or create collection
95
+ self._collection = self._client.get_or_create_collection(
96
+ name=self.namespace,
97
+ metadata={"hnsw:space": "cosine"}
98
+ )
99
+
100
+ def add(
101
+ self,
102
+ texts: List[str],
103
+ embeddings: List[List[float]],
104
+ metadatas: Optional[List[Dict[str, Any]]] = None,
105
+ ids: Optional[List[str]] = None,
106
+ namespace: Optional[str] = None
107
+ ) -> List[str]:
108
+ """Add vectors to ChromaDB."""
109
+ ids = ids or [str(uuid_module.uuid4()) for _ in texts]
110
+
111
+ # ChromaDB requires non-empty metadata dicts
112
+ # Ensure each metadata dict has at least one key
113
+ if metadatas is None:
114
+ metadatas = [{"_source": "praisonai"} for _ in texts]
115
+ else:
116
+ # Ensure no empty dicts - add placeholder if empty
117
+ metadatas = [
118
+ m if m else {"_source": "praisonai"}
119
+ for m in metadatas
120
+ ]
121
+
122
+ # Use different collection if namespace specified
123
+ if namespace and namespace != self.namespace:
124
+ collection = self._client.get_or_create_collection(name=namespace)
125
+ else:
126
+ collection = self._collection
127
+
128
+ collection.add(
129
+ ids=ids,
130
+ embeddings=embeddings,
131
+ documents=texts,
132
+ metadatas=metadatas
133
+ )
134
+
135
+ return ids
136
+
137
+ def query(
138
+ self,
139
+ embedding: List[float],
140
+ top_k: int = 10,
141
+ namespace: Optional[str] = None,
142
+ filter: Optional[Dict[str, Any]] = None
143
+ ) -> List[Any]:
144
+ """Query ChromaDB by similarity."""
145
+ from praisonaiagents.knowledge.vector_store import VectorRecord
146
+
147
+ if namespace and namespace != self.namespace:
148
+ collection = self._client.get_or_create_collection(name=namespace)
149
+ else:
150
+ collection = self._collection
151
+
152
+ results = collection.query(
153
+ query_embeddings=[embedding],
154
+ n_results=top_k,
155
+ where=filter
156
+ )
157
+
158
+ records = []
159
+ if results and results['ids'] and results['ids'][0]:
160
+ for i, id_ in enumerate(results['ids'][0]):
161
+ records.append(VectorRecord(
162
+ id=id_,
163
+ text=results['documents'][0][i] if results.get('documents') else "",
164
+ embedding=embedding, # We don't get embeddings back from query
165
+ metadata=results['metadatas'][0][i] if results.get('metadatas') else {},
166
+ score=1 - results['distances'][0][i] if results.get('distances') else 1.0
167
+ ))
168
+
169
+ return records
170
+
171
+ def delete(
172
+ self,
173
+ ids: Optional[List[str]] = None,
174
+ namespace: Optional[str] = None,
175
+ filter: Optional[Dict[str, Any]] = None,
176
+ delete_all: bool = False
177
+ ) -> int:
178
+ """Delete vectors from ChromaDB."""
179
+ if namespace and namespace != self.namespace:
180
+ collection = self._client.get_or_create_collection(name=namespace)
181
+ else:
182
+ collection = self._collection
183
+
184
+ if delete_all:
185
+ count = collection.count()
186
+ # Delete collection and recreate
187
+ self._client.delete_collection(collection.name)
188
+ self._collection = self._client.get_or_create_collection(
189
+ name=self.namespace,
190
+ metadata={"hnsw:space": "cosine"}
191
+ )
192
+ return count
193
+
194
+ if ids:
195
+ collection.delete(ids=ids)
196
+ return len(ids)
197
+
198
+ if filter:
199
+ # Get matching IDs first
200
+ results = collection.get(where=filter)
201
+ if results and results['ids']:
202
+ collection.delete(ids=results['ids'])
203
+ return len(results['ids'])
204
+
205
+ return 0
206
+
207
+ def count(self, namespace: Optional[str] = None) -> int:
208
+ """Get count of vectors."""
209
+ if namespace and namespace != self.namespace:
210
+ collection = self._client.get_or_create_collection(name=namespace)
211
+ else:
212
+ collection = self._collection
213
+ return collection.count()
214
+
215
+ def get(
216
+ self,
217
+ ids: List[str],
218
+ namespace: Optional[str] = None
219
+ ) -> List[Any]:
220
+ """Get vectors by ID."""
221
+ from praisonaiagents.knowledge.vector_store import VectorRecord
222
+
223
+ if namespace and namespace != self.namespace:
224
+ collection = self._client.get_or_create_collection(name=namespace)
225
+ else:
226
+ collection = self._collection
227
+
228
+ results = collection.get(ids=ids, include=["documents", "metadatas", "embeddings"])
229
+
230
+ records = []
231
+ if results and results['ids']:
232
+ for i, id_ in enumerate(results['ids']):
233
+ records.append(VectorRecord(
234
+ id=id_,
235
+ text=results['documents'][i] if results.get('documents') else "",
236
+ embedding=results['embeddings'][i] if results.get('embeddings') else [],
237
+ metadata=results['metadatas'][i] if results.get('metadatas') else {}
238
+ ))
239
+
240
+ return records
241
+
242
+
243
+ class PineconeVectorStore:
244
+ """Pinecone vector store adapter."""
245
+
246
+ name: str = "pinecone"
247
+
248
+ def __init__(
249
+ self,
250
+ config: Optional[Dict[str, Any]] = None,
251
+ namespace: Optional[str] = None,
252
+ api_key: Optional[str] = None,
253
+ index_name: Optional[str] = None
254
+ ):
255
+ if not _check_pinecone():
256
+ raise ImportError(
257
+ "pinecone is required for PineconeVectorStore. "
258
+ "Install with: pip install pinecone"
259
+ )
260
+
261
+ from pinecone import Pinecone
262
+
263
+ self.config = config or {}
264
+ self.namespace = namespace or "default"
265
+ self.api_key = api_key or os.environ.get("PINECONE_API_KEY")
266
+ self.index_name = index_name or self.config.get("index_name", "praisonai")
267
+
268
+ if not self.api_key:
269
+ raise ValueError("PINECONE_API_KEY environment variable or api_key parameter required")
270
+
271
+ self._pc = Pinecone(api_key=self.api_key)
272
+ self._index = self._pc.Index(self.index_name)
273
+
274
+ def add(
275
+ self,
276
+ texts: List[str],
277
+ embeddings: List[List[float]],
278
+ metadatas: Optional[List[Dict[str, Any]]] = None,
279
+ ids: Optional[List[str]] = None,
280
+ namespace: Optional[str] = None
281
+ ) -> List[str]:
282
+ """Add vectors to Pinecone."""
283
+ ids = ids or [str(uuid_module.uuid4()) for _ in texts]
284
+ metadatas = metadatas or [{} for _ in texts]
285
+ ns = namespace or self.namespace
286
+
287
+ # Add text to metadata for retrieval
288
+ vectors = []
289
+ for i, (id_, embedding, metadata) in enumerate(zip(ids, embeddings, metadatas)):
290
+ meta = metadata.copy()
291
+ meta["text"] = texts[i]
292
+ vectors.append({
293
+ "id": id_,
294
+ "values": embedding,
295
+ "metadata": meta
296
+ })
297
+
298
+ self._index.upsert(vectors=vectors, namespace=ns)
299
+ return ids
300
+
301
+ def query(
302
+ self,
303
+ embedding: List[float],
304
+ top_k: int = 10,
305
+ namespace: Optional[str] = None,
306
+ filter: Optional[Dict[str, Any]] = None
307
+ ) -> List[Any]:
308
+ """Query Pinecone by similarity."""
309
+ from praisonaiagents.knowledge.vector_store import VectorRecord
310
+
311
+ ns = namespace or self.namespace
312
+
313
+ results = self._index.query(
314
+ vector=embedding,
315
+ top_k=top_k,
316
+ namespace=ns,
317
+ filter=filter,
318
+ include_metadata=True
319
+ )
320
+
321
+ records = []
322
+ for match in results.get("matches", []):
323
+ metadata = match.get("metadata", {})
324
+ text = metadata.pop("text", "")
325
+ records.append(VectorRecord(
326
+ id=match["id"],
327
+ text=text,
328
+ embedding=embedding,
329
+ metadata=metadata,
330
+ score=match.get("score", 0.0)
331
+ ))
332
+
333
+ return records
334
+
335
+ def delete(
336
+ self,
337
+ ids: Optional[List[str]] = None,
338
+ namespace: Optional[str] = None,
339
+ filter: Optional[Dict[str, Any]] = None,
340
+ delete_all: bool = False
341
+ ) -> int:
342
+ """Delete vectors from Pinecone."""
343
+ ns = namespace or self.namespace
344
+
345
+ if delete_all:
346
+ self._index.delete(delete_all=True, namespace=ns)
347
+ return -1 # Pinecone doesn't return count
348
+
349
+ if ids:
350
+ self._index.delete(ids=ids, namespace=ns)
351
+ return len(ids)
352
+
353
+ if filter:
354
+ self._index.delete(filter=filter, namespace=ns)
355
+ return -1
356
+
357
+ return 0
358
+
359
+ def count(self, namespace: Optional[str] = None) -> int:
360
+ """Get count of vectors."""
361
+ ns = namespace or self.namespace
362
+ stats = self._index.describe_index_stats()
363
+ ns_stats = stats.get("namespaces", {}).get(ns, {})
364
+ return ns_stats.get("vector_count", 0)
365
+
366
+ def get(
367
+ self,
368
+ ids: List[str],
369
+ namespace: Optional[str] = None
370
+ ) -> List[Any]:
371
+ """Get vectors by ID."""
372
+ from praisonaiagents.knowledge.vector_store import VectorRecord
373
+
374
+ ns = namespace or self.namespace
375
+ results = self._index.fetch(ids=ids, namespace=ns)
376
+
377
+ records = []
378
+ for id_, data in results.get("vectors", {}).items():
379
+ metadata = data.get("metadata", {})
380
+ text = metadata.pop("text", "")
381
+ records.append(VectorRecord(
382
+ id=id_,
383
+ text=text,
384
+ embedding=data.get("values", []),
385
+ metadata=metadata
386
+ ))
387
+
388
+ return records
389
+
390
+
391
+ def register_default_vector_stores():
392
+ """Register all default vector stores with the registry."""
393
+ from praisonaiagents.knowledge.vector_store import get_vector_store_registry
394
+
395
+ registry = get_vector_store_registry()
396
+
397
+ # Register ChromaDB
398
+ if _check_chroma():
399
+ registry.register("chroma", ChromaVectorStore)
400
+
401
+ # Register Pinecone
402
+ if _check_pinecone():
403
+ registry.register("pinecone", PineconeVectorStore)
404
+
405
+ logger.debug("Registered default vector stores")
406
+
407
+
408
+ # Auto-register on import
409
+ register_default_vector_stores()