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,223 @@
1
+ """
2
+ Weaviate implementation of KnowledgeStore.
3
+
4
+ Requires: weaviate-client
5
+ Install: pip install weaviate-client
6
+ """
7
+
8
+ import logging
9
+ import os
10
+ from typing import Any, Dict, List, Optional
11
+
12
+ from .base import KnowledgeStore, KnowledgeDocument
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class WeaviateKnowledgeStore(KnowledgeStore):
18
+ """
19
+ Weaviate-based knowledge store for vector search.
20
+
21
+ Example:
22
+ store = WeaviateKnowledgeStore(
23
+ url="http://localhost:8080"
24
+ )
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ url: Optional[str] = None,
30
+ api_key: Optional[str] = None,
31
+ additional_headers: Optional[Dict[str, str]] = None,
32
+ ):
33
+ try:
34
+ import weaviate
35
+ except ImportError:
36
+ raise ImportError(
37
+ "weaviate-client is required for Weaviate support. "
38
+ "Install with: pip install weaviate-client"
39
+ )
40
+
41
+ url = url or os.getenv("WEAVIATE_URL", "http://localhost:8080")
42
+ api_key = api_key or os.getenv("WEAVIATE_API_KEY")
43
+
44
+ auth = weaviate.auth.AuthApiKey(api_key) if api_key else None
45
+ self._client = weaviate.connect_to_custom(
46
+ http_host=url.replace("http://", "").replace("https://", "").split(":")[0],
47
+ http_port=int(url.split(":")[-1]) if ":" in url.split("/")[-1] else 8080,
48
+ http_secure=url.startswith("https"),
49
+ auth_credentials=auth,
50
+ additional_headers=additional_headers,
51
+ )
52
+ logger.info(f"Connected to Weaviate at {url}")
53
+
54
+ def create_collection(
55
+ self,
56
+ name: str,
57
+ dimension: int,
58
+ distance: str = "cosine",
59
+ metadata: Optional[Dict[str, Any]] = None
60
+ ) -> None:
61
+ """Create a new collection (class in Weaviate)."""
62
+ from weaviate.classes.config import Configure, Property, DataType
63
+
64
+ distance_map = {"cosine": "cosine", "euclidean": "l2-squared", "dot": "dot"}
65
+
66
+ self._client.collections.create(
67
+ name=name,
68
+ vectorizer_config=Configure.Vectorizer.none(),
69
+ vector_index_config=Configure.VectorIndex.hnsw(
70
+ distance_metric=distance_map.get(distance, "cosine")
71
+ ),
72
+ properties=[
73
+ Property(name="content", data_type=DataType.TEXT),
74
+ Property(name="content_hash", data_type=DataType.TEXT),
75
+ Property(name="created_at", data_type=DataType.NUMBER),
76
+ ]
77
+ )
78
+ logger.info(f"Created Weaviate collection: {name}")
79
+
80
+ def delete_collection(self, name: str) -> bool:
81
+ """Delete a collection."""
82
+ try:
83
+ self._client.collections.delete(name)
84
+ return True
85
+ except Exception as e:
86
+ logger.warning(f"Failed to delete collection {name}: {e}")
87
+ return False
88
+
89
+ def collection_exists(self, name: str) -> bool:
90
+ """Check if a collection exists."""
91
+ return self._client.collections.exists(name)
92
+
93
+ def list_collections(self) -> List[str]:
94
+ """List all collections."""
95
+ return [c.name for c in self._client.collections.list_all().values()]
96
+
97
+ def insert(
98
+ self,
99
+ collection: str,
100
+ documents: List[KnowledgeDocument]
101
+ ) -> List[str]:
102
+ """Insert documents."""
103
+ col = self._client.collections.get(collection)
104
+ ids = []
105
+
106
+ with col.batch.dynamic() as batch:
107
+ for doc in documents:
108
+ if doc.embedding is None:
109
+ raise ValueError(f"Document {doc.id} has no embedding")
110
+
111
+ properties = {
112
+ "content": doc.content,
113
+ "content_hash": doc.content_hash or "",
114
+ "created_at": doc.created_at,
115
+ **(doc.metadata or {})
116
+ }
117
+
118
+ batch.add_object(
119
+ properties=properties,
120
+ vector=doc.embedding,
121
+ uuid=doc.id,
122
+ )
123
+ ids.append(doc.id)
124
+
125
+ return ids
126
+
127
+ def upsert(
128
+ self,
129
+ collection: str,
130
+ documents: List[KnowledgeDocument]
131
+ ) -> List[str]:
132
+ """Insert or update documents."""
133
+ return self.insert(collection, documents)
134
+
135
+ def search(
136
+ self,
137
+ collection: str,
138
+ query_embedding: List[float],
139
+ limit: int = 5,
140
+ filters: Optional[Dict[str, Any]] = None,
141
+ score_threshold: Optional[float] = None
142
+ ) -> List[KnowledgeDocument]:
143
+ """Search for similar documents."""
144
+ col = self._client.collections.get(collection)
145
+
146
+ query = col.query.near_vector(
147
+ near_vector=query_embedding,
148
+ limit=limit,
149
+ return_metadata=["distance"],
150
+ )
151
+
152
+ documents = []
153
+ for obj in query.objects:
154
+ if score_threshold:
155
+ score = 1 - (obj.metadata.distance or 0)
156
+ if score < score_threshold:
157
+ continue
158
+
159
+ props = obj.properties
160
+ doc = KnowledgeDocument(
161
+ id=str(obj.uuid),
162
+ content=props.get("content", ""),
163
+ embedding=None,
164
+ metadata={k: v for k, v in props.items() if k not in ("content", "content_hash", "created_at")},
165
+ content_hash=props.get("content_hash"),
166
+ created_at=props.get("created_at", 0),
167
+ )
168
+ documents.append(doc)
169
+
170
+ return documents
171
+
172
+ def get(
173
+ self,
174
+ collection: str,
175
+ ids: List[str]
176
+ ) -> List[KnowledgeDocument]:
177
+ """Get documents by IDs."""
178
+ col = self._client.collections.get(collection)
179
+ documents = []
180
+
181
+ for doc_id in ids:
182
+ try:
183
+ obj = col.query.fetch_object_by_id(doc_id, include_vector=True)
184
+ if obj:
185
+ props = obj.properties
186
+ doc = KnowledgeDocument(
187
+ id=str(obj.uuid),
188
+ content=props.get("content", ""),
189
+ embedding=list(obj.vector) if obj.vector else None,
190
+ metadata={k: v for k, v in props.items() if k not in ("content", "content_hash", "created_at")},
191
+ content_hash=props.get("content_hash"),
192
+ created_at=props.get("created_at", 0),
193
+ )
194
+ documents.append(doc)
195
+ except Exception:
196
+ pass
197
+
198
+ return documents
199
+
200
+ def delete(
201
+ self,
202
+ collection: str,
203
+ ids: Optional[List[str]] = None,
204
+ filters: Optional[Dict[str, Any]] = None
205
+ ) -> int:
206
+ """Delete documents."""
207
+ col = self._client.collections.get(collection)
208
+
209
+ if ids:
210
+ for doc_id in ids:
211
+ col.data.delete_by_id(doc_id)
212
+ return len(ids)
213
+ return 0
214
+
215
+ def count(self, collection: str) -> int:
216
+ """Count documents."""
217
+ col = self._client.collections.get(collection)
218
+ return col.aggregate.over_all(total_count=True).total_count or 0
219
+
220
+ def close(self) -> None:
221
+ """Close the store."""
222
+ if self._client:
223
+ self._client.close()
@@ -0,0 +1,10 @@
1
+ """
2
+ Schema versioning and migrations for PraisonAI persistence.
3
+
4
+ This module provides tools for managing database schema versions
5
+ and applying migrations when upgrading.
6
+ """
7
+
8
+ from .manager import MigrationManager, SchemaVersion
9
+
10
+ __all__ = ["MigrationManager", "SchemaVersion"]
@@ -0,0 +1,251 @@
1
+ """
2
+ Migration manager for PraisonAI persistence schema versioning.
3
+ """
4
+
5
+ import logging
6
+ from dataclasses import dataclass, field
7
+ from typing import Any, Callable, Dict, List, Optional, Tuple
8
+ from packaging import version as pkg_version
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ @dataclass
14
+ class SchemaVersion:
15
+ """Represents a schema version."""
16
+ version: str
17
+ description: str = ""
18
+ applied_at: Optional[float] = None
19
+
20
+ def __lt__(self, other: "SchemaVersion") -> bool:
21
+ return pkg_version.parse(self.version) < pkg_version.parse(other.version)
22
+
23
+ def __eq__(self, other: object) -> bool:
24
+ if not isinstance(other, SchemaVersion):
25
+ return False
26
+ return self.version == other.version
27
+
28
+
29
+ @dataclass
30
+ class Migration:
31
+ """Represents a single migration."""
32
+ version: str
33
+ description: str
34
+ up: Callable[[Any], None]
35
+ down: Optional[Callable[[Any], None]] = None
36
+
37
+
38
+ class MigrationManager:
39
+ """
40
+ Manages database schema versions and migrations.
41
+
42
+ Example:
43
+ manager = MigrationManager(db_adapter)
44
+ manager.register_migration(
45
+ version="1.0.0",
46
+ description="Initial schema",
47
+ up=lambda db: db.execute("CREATE TABLE ..."),
48
+ down=lambda db: db.execute("DROP TABLE ...")
49
+ )
50
+ manager.migrate_up() # Apply all pending migrations
51
+ """
52
+
53
+ # Current schema version
54
+ CURRENT_VERSION = "1.0.0"
55
+
56
+ def __init__(self, db_adapter: Any = None):
57
+ """
58
+ Initialize migration manager.
59
+
60
+ Args:
61
+ db_adapter: Database adapter (PraisonDB or similar)
62
+ """
63
+ self._db = db_adapter
64
+ self._migrations: List[Migration] = []
65
+ self._versions_table = "praison_schema_versions"
66
+
67
+ # Register built-in migrations
68
+ self._register_builtin_migrations()
69
+
70
+ def _register_builtin_migrations(self):
71
+ """Register built-in migrations."""
72
+ self.register_migration(
73
+ version="1.0.0",
74
+ description="Initial schema with sessions, messages, runs",
75
+ up=self._migrate_1_0_0_up,
76
+ down=self._migrate_1_0_0_down
77
+ )
78
+
79
+ def register_migration(
80
+ self,
81
+ version: str,
82
+ description: str,
83
+ up: Callable[[Any], None],
84
+ down: Optional[Callable[[Any], None]] = None
85
+ ):
86
+ """
87
+ Register a new migration.
88
+
89
+ Args:
90
+ version: Version string (e.g., "1.0.0")
91
+ description: Human-readable description
92
+ up: Function to apply migration
93
+ down: Optional function to rollback migration
94
+ """
95
+ migration = Migration(
96
+ version=version,
97
+ description=description,
98
+ up=up,
99
+ down=down
100
+ )
101
+ self._migrations.append(migration)
102
+ self._migrations.sort(key=lambda m: pkg_version.parse(m.version))
103
+
104
+ def get_current_version(self) -> Optional[str]:
105
+ """Get the current schema version from database."""
106
+ if not self._db:
107
+ return None
108
+
109
+ try:
110
+ # Try to get version from state store
111
+ if hasattr(self._db, '_state_store') and self._db._state_store:
112
+ self._db._init_stores()
113
+ version_data = self._db._state_store.get(f"{self._versions_table}:current")
114
+ if version_data:
115
+ return version_data.get("version")
116
+ except Exception as e:
117
+ logger.warning(f"Failed to get schema version: {e}")
118
+
119
+ return None
120
+
121
+ def set_current_version(self, version: str):
122
+ """Set the current schema version in database."""
123
+ if not self._db:
124
+ return
125
+
126
+ try:
127
+ if hasattr(self._db, '_state_store') and self._db._state_store:
128
+ self._db._init_stores()
129
+ import time
130
+ self._db._state_store.set(f"{self._versions_table}:current", {
131
+ "version": version,
132
+ "applied_at": time.time()
133
+ })
134
+ except Exception as e:
135
+ logger.warning(f"Failed to set schema version: {e}")
136
+
137
+ def get_pending_migrations(self) -> List[Migration]:
138
+ """Get list of migrations that haven't been applied."""
139
+ current = self.get_current_version()
140
+ if not current:
141
+ return self._migrations.copy()
142
+
143
+ current_ver = pkg_version.parse(current)
144
+ return [
145
+ m for m in self._migrations
146
+ if pkg_version.parse(m.version) > current_ver
147
+ ]
148
+
149
+ def migrate_up(self, target_version: Optional[str] = None) -> List[str]:
150
+ """
151
+ Apply pending migrations up to target version.
152
+
153
+ Args:
154
+ target_version: Optional target version (default: latest)
155
+
156
+ Returns:
157
+ List of applied migration versions
158
+ """
159
+ pending = self.get_pending_migrations()
160
+ if not pending:
161
+ logger.info("No pending migrations")
162
+ return []
163
+
164
+ target = pkg_version.parse(target_version) if target_version else None
165
+ applied = []
166
+
167
+ for migration in pending:
168
+ if target and pkg_version.parse(migration.version) > target:
169
+ break
170
+
171
+ logger.info(f"Applying migration {migration.version}: {migration.description}")
172
+ try:
173
+ migration.up(self._db)
174
+ self.set_current_version(migration.version)
175
+ applied.append(migration.version)
176
+ logger.info(f"Successfully applied migration {migration.version}")
177
+ except Exception as e:
178
+ logger.error(f"Failed to apply migration {migration.version}: {e}")
179
+ raise
180
+
181
+ return applied
182
+
183
+ def migrate_down(self, target_version: str) -> List[str]:
184
+ """
185
+ Rollback migrations down to target version.
186
+
187
+ Args:
188
+ target_version: Target version to rollback to
189
+
190
+ Returns:
191
+ List of rolled back migration versions
192
+ """
193
+ current = self.get_current_version()
194
+ if not current:
195
+ logger.info("No migrations to rollback")
196
+ return []
197
+
198
+ current_ver = pkg_version.parse(current)
199
+ target_ver = pkg_version.parse(target_version)
200
+
201
+ if target_ver >= current_ver:
202
+ logger.info("Target version is not lower than current")
203
+ return []
204
+
205
+ # Get migrations to rollback (in reverse order)
206
+ to_rollback = [
207
+ m for m in reversed(self._migrations)
208
+ if pkg_version.parse(m.version) > target_ver and pkg_version.parse(m.version) <= current_ver
209
+ ]
210
+
211
+ rolled_back = []
212
+ for migration in to_rollback:
213
+ if not migration.down:
214
+ logger.warning(f"Migration {migration.version} has no down function, skipping")
215
+ continue
216
+
217
+ logger.info(f"Rolling back migration {migration.version}")
218
+ try:
219
+ migration.down(self._db)
220
+ rolled_back.append(migration.version)
221
+ logger.info(f"Successfully rolled back migration {migration.version}")
222
+ except Exception as e:
223
+ logger.error(f"Failed to rollback migration {migration.version}: {e}")
224
+ raise
225
+
226
+ self.set_current_version(target_version)
227
+ return rolled_back
228
+
229
+ def get_migration_status(self) -> Dict[str, Any]:
230
+ """Get current migration status."""
231
+ current = self.get_current_version()
232
+ pending = self.get_pending_migrations()
233
+
234
+ return {
235
+ "current_version": current,
236
+ "latest_version": self._migrations[-1].version if self._migrations else None,
237
+ "pending_count": len(pending),
238
+ "pending_versions": [m.version for m in pending],
239
+ "all_versions": [m.version for m in self._migrations]
240
+ }
241
+
242
+ # --- Built-in Migrations ---
243
+
244
+ def _migrate_1_0_0_up(self, db: Any):
245
+ """Initial schema migration."""
246
+ # This is a no-op since tables are created on first use
247
+ logger.info("Initial schema (1.0.0) - tables created on first use")
248
+
249
+ def _migrate_1_0_0_down(self, db: Any):
250
+ """Rollback initial schema."""
251
+ logger.info("Rolling back initial schema (1.0.0)")