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.
- praisonai/__init__.py +54 -0
- praisonai/__main__.py +15 -0
- praisonai/acp/__init__.py +54 -0
- praisonai/acp/config.py +159 -0
- praisonai/acp/server.py +587 -0
- praisonai/acp/session.py +219 -0
- praisonai/adapters/__init__.py +50 -0
- praisonai/adapters/readers.py +395 -0
- praisonai/adapters/rerankers.py +315 -0
- praisonai/adapters/retrievers.py +394 -0
- praisonai/adapters/vector_stores.py +409 -0
- praisonai/agent_scheduler.py +337 -0
- praisonai/agents_generator.py +903 -0
- praisonai/api/call.py +292 -0
- praisonai/auto.py +1197 -0
- praisonai/capabilities/__init__.py +275 -0
- praisonai/capabilities/a2a.py +140 -0
- praisonai/capabilities/assistants.py +283 -0
- praisonai/capabilities/audio.py +320 -0
- praisonai/capabilities/batches.py +469 -0
- praisonai/capabilities/completions.py +336 -0
- praisonai/capabilities/container_files.py +155 -0
- praisonai/capabilities/containers.py +93 -0
- praisonai/capabilities/embeddings.py +158 -0
- praisonai/capabilities/files.py +467 -0
- praisonai/capabilities/fine_tuning.py +293 -0
- praisonai/capabilities/guardrails.py +182 -0
- praisonai/capabilities/images.py +330 -0
- praisonai/capabilities/mcp.py +190 -0
- praisonai/capabilities/messages.py +270 -0
- praisonai/capabilities/moderations.py +154 -0
- praisonai/capabilities/ocr.py +217 -0
- praisonai/capabilities/passthrough.py +204 -0
- praisonai/capabilities/rag.py +207 -0
- praisonai/capabilities/realtime.py +160 -0
- praisonai/capabilities/rerank.py +165 -0
- praisonai/capabilities/responses.py +266 -0
- praisonai/capabilities/search.py +109 -0
- praisonai/capabilities/skills.py +133 -0
- praisonai/capabilities/vector_store_files.py +334 -0
- praisonai/capabilities/vector_stores.py +304 -0
- praisonai/capabilities/videos.py +141 -0
- praisonai/chainlit_ui.py +304 -0
- praisonai/chat/__init__.py +106 -0
- praisonai/chat/app.py +125 -0
- praisonai/cli/__init__.py +26 -0
- praisonai/cli/app.py +213 -0
- praisonai/cli/commands/__init__.py +75 -0
- praisonai/cli/commands/acp.py +70 -0
- praisonai/cli/commands/completion.py +333 -0
- praisonai/cli/commands/config.py +166 -0
- praisonai/cli/commands/debug.py +142 -0
- praisonai/cli/commands/diag.py +55 -0
- praisonai/cli/commands/doctor.py +166 -0
- praisonai/cli/commands/environment.py +179 -0
- praisonai/cli/commands/lsp.py +112 -0
- praisonai/cli/commands/mcp.py +210 -0
- praisonai/cli/commands/profile.py +457 -0
- praisonai/cli/commands/run.py +228 -0
- praisonai/cli/commands/schedule.py +150 -0
- praisonai/cli/commands/serve.py +97 -0
- praisonai/cli/commands/session.py +212 -0
- praisonai/cli/commands/traces.py +145 -0
- praisonai/cli/commands/version.py +101 -0
- praisonai/cli/configuration/__init__.py +18 -0
- praisonai/cli/configuration/loader.py +353 -0
- praisonai/cli/configuration/paths.py +114 -0
- praisonai/cli/configuration/schema.py +164 -0
- praisonai/cli/features/__init__.py +268 -0
- praisonai/cli/features/acp.py +236 -0
- praisonai/cli/features/action_orchestrator.py +546 -0
- praisonai/cli/features/agent_scheduler.py +773 -0
- praisonai/cli/features/agent_tools.py +474 -0
- praisonai/cli/features/agents.py +375 -0
- praisonai/cli/features/at_mentions.py +471 -0
- praisonai/cli/features/auto_memory.py +182 -0
- praisonai/cli/features/autonomy_mode.py +490 -0
- praisonai/cli/features/background.py +356 -0
- praisonai/cli/features/base.py +168 -0
- praisonai/cli/features/capabilities.py +1326 -0
- praisonai/cli/features/checkpoints.py +338 -0
- praisonai/cli/features/code_intelligence.py +652 -0
- praisonai/cli/features/compaction.py +294 -0
- praisonai/cli/features/compare.py +534 -0
- praisonai/cli/features/cost_tracker.py +514 -0
- praisonai/cli/features/debug.py +810 -0
- praisonai/cli/features/deploy.py +517 -0
- praisonai/cli/features/diag.py +289 -0
- praisonai/cli/features/doctor/__init__.py +63 -0
- praisonai/cli/features/doctor/checks/__init__.py +24 -0
- praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
- praisonai/cli/features/doctor/checks/config_checks.py +366 -0
- praisonai/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai/cli/features/doctor/checks/env_checks.py +543 -0
- praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
- praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
- praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
- praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai/cli/features/doctor/engine.py +266 -0
- praisonai/cli/features/doctor/formatters.py +310 -0
- praisonai/cli/features/doctor/handler.py +397 -0
- praisonai/cli/features/doctor/models.py +264 -0
- praisonai/cli/features/doctor/registry.py +239 -0
- praisonai/cli/features/endpoints.py +1019 -0
- praisonai/cli/features/eval.py +560 -0
- praisonai/cli/features/external_agents.py +231 -0
- praisonai/cli/features/fast_context.py +410 -0
- praisonai/cli/features/flow_display.py +566 -0
- praisonai/cli/features/git_integration.py +651 -0
- praisonai/cli/features/guardrail.py +171 -0
- praisonai/cli/features/handoff.py +185 -0
- praisonai/cli/features/hooks.py +583 -0
- praisonai/cli/features/image.py +384 -0
- praisonai/cli/features/interactive_runtime.py +585 -0
- praisonai/cli/features/interactive_tools.py +380 -0
- praisonai/cli/features/interactive_tui.py +603 -0
- praisonai/cli/features/jobs.py +632 -0
- praisonai/cli/features/knowledge.py +531 -0
- praisonai/cli/features/lite.py +244 -0
- praisonai/cli/features/lsp_cli.py +225 -0
- praisonai/cli/features/mcp.py +169 -0
- praisonai/cli/features/message_queue.py +587 -0
- praisonai/cli/features/metrics.py +211 -0
- praisonai/cli/features/n8n.py +673 -0
- praisonai/cli/features/observability.py +293 -0
- praisonai/cli/features/ollama.py +361 -0
- praisonai/cli/features/output_style.py +273 -0
- praisonai/cli/features/package.py +631 -0
- praisonai/cli/features/performance.py +308 -0
- praisonai/cli/features/persistence.py +636 -0
- praisonai/cli/features/profile.py +226 -0
- praisonai/cli/features/profiler/__init__.py +81 -0
- praisonai/cli/features/profiler/core.py +558 -0
- praisonai/cli/features/profiler/optimizations.py +652 -0
- praisonai/cli/features/profiler/suite.py +386 -0
- praisonai/cli/features/profiling.py +350 -0
- praisonai/cli/features/queue/__init__.py +73 -0
- praisonai/cli/features/queue/manager.py +395 -0
- praisonai/cli/features/queue/models.py +286 -0
- praisonai/cli/features/queue/persistence.py +564 -0
- praisonai/cli/features/queue/scheduler.py +484 -0
- praisonai/cli/features/queue/worker.py +372 -0
- praisonai/cli/features/recipe.py +1723 -0
- praisonai/cli/features/recipes.py +449 -0
- praisonai/cli/features/registry.py +229 -0
- praisonai/cli/features/repo_map.py +860 -0
- praisonai/cli/features/router.py +466 -0
- praisonai/cli/features/sandbox_executor.py +515 -0
- praisonai/cli/features/serve.py +829 -0
- praisonai/cli/features/session.py +222 -0
- praisonai/cli/features/skills.py +856 -0
- praisonai/cli/features/slash_commands.py +650 -0
- praisonai/cli/features/telemetry.py +179 -0
- praisonai/cli/features/templates.py +1384 -0
- praisonai/cli/features/thinking.py +305 -0
- praisonai/cli/features/todo.py +334 -0
- praisonai/cli/features/tools.py +680 -0
- praisonai/cli/features/tui/__init__.py +83 -0
- praisonai/cli/features/tui/app.py +580 -0
- praisonai/cli/features/tui/cli.py +566 -0
- praisonai/cli/features/tui/debug.py +511 -0
- praisonai/cli/features/tui/events.py +99 -0
- praisonai/cli/features/tui/mock_provider.py +328 -0
- praisonai/cli/features/tui/orchestrator.py +652 -0
- praisonai/cli/features/tui/screens/__init__.py +50 -0
- praisonai/cli/features/tui/screens/main.py +245 -0
- praisonai/cli/features/tui/screens/queue.py +174 -0
- praisonai/cli/features/tui/screens/session.py +124 -0
- praisonai/cli/features/tui/screens/settings.py +148 -0
- praisonai/cli/features/tui/widgets/__init__.py +56 -0
- praisonai/cli/features/tui/widgets/chat.py +261 -0
- praisonai/cli/features/tui/widgets/composer.py +224 -0
- praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
- praisonai/cli/features/tui/widgets/status.py +167 -0
- praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
- praisonai/cli/features/workflow.py +720 -0
- praisonai/cli/legacy.py +236 -0
- praisonai/cli/main.py +5559 -0
- praisonai/cli/schedule_cli.py +54 -0
- praisonai/cli/state/__init__.py +31 -0
- praisonai/cli/state/identifiers.py +161 -0
- praisonai/cli/state/sessions.py +313 -0
- praisonai/code/__init__.py +93 -0
- praisonai/code/agent_tools.py +344 -0
- praisonai/code/diff/__init__.py +21 -0
- praisonai/code/diff/diff_strategy.py +432 -0
- praisonai/code/tools/__init__.py +27 -0
- praisonai/code/tools/apply_diff.py +221 -0
- praisonai/code/tools/execute_command.py +275 -0
- praisonai/code/tools/list_files.py +274 -0
- praisonai/code/tools/read_file.py +206 -0
- praisonai/code/tools/search_replace.py +248 -0
- praisonai/code/tools/write_file.py +217 -0
- praisonai/code/utils/__init__.py +46 -0
- praisonai/code/utils/file_utils.py +307 -0
- praisonai/code/utils/ignore_utils.py +308 -0
- praisonai/code/utils/text_utils.py +276 -0
- praisonai/db/__init__.py +64 -0
- praisonai/db/adapter.py +531 -0
- praisonai/deploy/__init__.py +62 -0
- praisonai/deploy/api.py +231 -0
- praisonai/deploy/docker.py +454 -0
- praisonai/deploy/doctor.py +367 -0
- praisonai/deploy/main.py +327 -0
- praisonai/deploy/models.py +179 -0
- praisonai/deploy/providers/__init__.py +33 -0
- praisonai/deploy/providers/aws.py +331 -0
- praisonai/deploy/providers/azure.py +358 -0
- praisonai/deploy/providers/base.py +101 -0
- praisonai/deploy/providers/gcp.py +314 -0
- praisonai/deploy/schema.py +208 -0
- praisonai/deploy.py +185 -0
- praisonai/endpoints/__init__.py +53 -0
- praisonai/endpoints/a2u_server.py +410 -0
- praisonai/endpoints/discovery.py +165 -0
- praisonai/endpoints/providers/__init__.py +28 -0
- praisonai/endpoints/providers/a2a.py +253 -0
- praisonai/endpoints/providers/a2u.py +208 -0
- praisonai/endpoints/providers/agents_api.py +171 -0
- praisonai/endpoints/providers/base.py +231 -0
- praisonai/endpoints/providers/mcp.py +263 -0
- praisonai/endpoints/providers/recipe.py +206 -0
- praisonai/endpoints/providers/tools_mcp.py +150 -0
- praisonai/endpoints/registry.py +131 -0
- praisonai/endpoints/server.py +161 -0
- praisonai/inbuilt_tools/__init__.py +24 -0
- praisonai/inbuilt_tools/autogen_tools.py +117 -0
- praisonai/inc/__init__.py +2 -0
- praisonai/inc/config.py +96 -0
- praisonai/inc/models.py +155 -0
- praisonai/integrations/__init__.py +56 -0
- praisonai/integrations/base.py +303 -0
- praisonai/integrations/claude_code.py +270 -0
- praisonai/integrations/codex_cli.py +255 -0
- praisonai/integrations/cursor_cli.py +195 -0
- praisonai/integrations/gemini_cli.py +222 -0
- praisonai/jobs/__init__.py +67 -0
- praisonai/jobs/executor.py +425 -0
- praisonai/jobs/models.py +230 -0
- praisonai/jobs/router.py +314 -0
- praisonai/jobs/server.py +186 -0
- praisonai/jobs/store.py +203 -0
- praisonai/llm/__init__.py +66 -0
- praisonai/llm/registry.py +382 -0
- praisonai/mcp_server/__init__.py +152 -0
- praisonai/mcp_server/adapters/__init__.py +74 -0
- praisonai/mcp_server/adapters/agents.py +128 -0
- praisonai/mcp_server/adapters/capabilities.py +168 -0
- praisonai/mcp_server/adapters/cli_tools.py +568 -0
- praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
- praisonai/mcp_server/adapters/knowledge.py +93 -0
- praisonai/mcp_server/adapters/memory.py +104 -0
- praisonai/mcp_server/adapters/prompts.py +306 -0
- praisonai/mcp_server/adapters/resources.py +124 -0
- praisonai/mcp_server/adapters/tools_bridge.py +280 -0
- praisonai/mcp_server/auth/__init__.py +48 -0
- praisonai/mcp_server/auth/api_key.py +291 -0
- praisonai/mcp_server/auth/oauth.py +460 -0
- praisonai/mcp_server/auth/oidc.py +289 -0
- praisonai/mcp_server/auth/scopes.py +260 -0
- praisonai/mcp_server/cli.py +852 -0
- praisonai/mcp_server/elicitation.py +445 -0
- praisonai/mcp_server/icons.py +302 -0
- praisonai/mcp_server/recipe_adapter.py +573 -0
- praisonai/mcp_server/recipe_cli.py +824 -0
- praisonai/mcp_server/registry.py +703 -0
- praisonai/mcp_server/sampling.py +422 -0
- praisonai/mcp_server/server.py +490 -0
- praisonai/mcp_server/tasks.py +443 -0
- praisonai/mcp_server/transports/__init__.py +18 -0
- praisonai/mcp_server/transports/http_stream.py +376 -0
- praisonai/mcp_server/transports/stdio.py +132 -0
- praisonai/persistence/__init__.py +84 -0
- praisonai/persistence/config.py +238 -0
- praisonai/persistence/conversation/__init__.py +25 -0
- praisonai/persistence/conversation/async_mysql.py +427 -0
- praisonai/persistence/conversation/async_postgres.py +410 -0
- praisonai/persistence/conversation/async_sqlite.py +371 -0
- praisonai/persistence/conversation/base.py +151 -0
- praisonai/persistence/conversation/json_store.py +250 -0
- praisonai/persistence/conversation/mysql.py +387 -0
- praisonai/persistence/conversation/postgres.py +401 -0
- praisonai/persistence/conversation/singlestore.py +240 -0
- praisonai/persistence/conversation/sqlite.py +341 -0
- praisonai/persistence/conversation/supabase.py +203 -0
- praisonai/persistence/conversation/surrealdb.py +287 -0
- praisonai/persistence/factory.py +301 -0
- praisonai/persistence/hooks/__init__.py +18 -0
- praisonai/persistence/hooks/agent_hooks.py +297 -0
- praisonai/persistence/knowledge/__init__.py +26 -0
- praisonai/persistence/knowledge/base.py +144 -0
- praisonai/persistence/knowledge/cassandra.py +232 -0
- praisonai/persistence/knowledge/chroma.py +295 -0
- praisonai/persistence/knowledge/clickhouse.py +242 -0
- praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
- praisonai/persistence/knowledge/couchbase.py +286 -0
- praisonai/persistence/knowledge/lancedb.py +216 -0
- praisonai/persistence/knowledge/langchain_adapter.py +291 -0
- praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
- praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
- praisonai/persistence/knowledge/milvus.py +277 -0
- praisonai/persistence/knowledge/mongodb_vector.py +306 -0
- praisonai/persistence/knowledge/pgvector.py +335 -0
- praisonai/persistence/knowledge/pinecone.py +253 -0
- praisonai/persistence/knowledge/qdrant.py +301 -0
- praisonai/persistence/knowledge/redis_vector.py +291 -0
- praisonai/persistence/knowledge/singlestore_vector.py +299 -0
- praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
- praisonai/persistence/knowledge/upstash_vector.py +266 -0
- praisonai/persistence/knowledge/weaviate.py +223 -0
- praisonai/persistence/migrations/__init__.py +10 -0
- praisonai/persistence/migrations/manager.py +251 -0
- praisonai/persistence/orchestrator.py +406 -0
- praisonai/persistence/state/__init__.py +21 -0
- praisonai/persistence/state/async_mongodb.py +200 -0
- praisonai/persistence/state/base.py +107 -0
- praisonai/persistence/state/dynamodb.py +226 -0
- praisonai/persistence/state/firestore.py +175 -0
- praisonai/persistence/state/gcs.py +155 -0
- praisonai/persistence/state/memory.py +245 -0
- praisonai/persistence/state/mongodb.py +158 -0
- praisonai/persistence/state/redis.py +190 -0
- praisonai/persistence/state/upstash.py +144 -0
- praisonai/persistence/tests/__init__.py +3 -0
- praisonai/persistence/tests/test_all_backends.py +633 -0
- praisonai/profiler.py +1214 -0
- praisonai/recipe/__init__.py +134 -0
- praisonai/recipe/bridge.py +278 -0
- praisonai/recipe/core.py +893 -0
- praisonai/recipe/exceptions.py +54 -0
- praisonai/recipe/history.py +402 -0
- praisonai/recipe/models.py +266 -0
- praisonai/recipe/operations.py +440 -0
- praisonai/recipe/policy.py +422 -0
- praisonai/recipe/registry.py +849 -0
- praisonai/recipe/runtime.py +214 -0
- praisonai/recipe/security.py +711 -0
- praisonai/recipe/serve.py +859 -0
- praisonai/recipe/server.py +613 -0
- praisonai/scheduler/__init__.py +45 -0
- praisonai/scheduler/agent_scheduler.py +552 -0
- praisonai/scheduler/base.py +124 -0
- praisonai/scheduler/daemon_manager.py +225 -0
- praisonai/scheduler/state_manager.py +155 -0
- praisonai/scheduler/yaml_loader.py +193 -0
- praisonai/scheduler.py +194 -0
- praisonai/setup/__init__.py +1 -0
- praisonai/setup/build.py +21 -0
- praisonai/setup/post_install.py +23 -0
- praisonai/setup/setup_conda_env.py +25 -0
- praisonai/setup.py +16 -0
- praisonai/templates/__init__.py +116 -0
- praisonai/templates/cache.py +364 -0
- praisonai/templates/dependency_checker.py +358 -0
- praisonai/templates/discovery.py +391 -0
- praisonai/templates/loader.py +564 -0
- praisonai/templates/registry.py +511 -0
- praisonai/templates/resolver.py +206 -0
- praisonai/templates/security.py +327 -0
- praisonai/templates/tool_override.py +498 -0
- praisonai/templates/tools_doctor.py +256 -0
- praisonai/test.py +105 -0
- praisonai/train.py +562 -0
- praisonai/train_vision.py +306 -0
- praisonai/ui/agents.py +824 -0
- praisonai/ui/callbacks.py +57 -0
- praisonai/ui/chainlit_compat.py +246 -0
- praisonai/ui/chat.py +532 -0
- praisonai/ui/code.py +717 -0
- praisonai/ui/colab.py +474 -0
- praisonai/ui/colab_chainlit.py +81 -0
- praisonai/ui/components/aicoder.py +284 -0
- praisonai/ui/context.py +283 -0
- praisonai/ui/database_config.py +56 -0
- praisonai/ui/db.py +294 -0
- praisonai/ui/realtime.py +488 -0
- praisonai/ui/realtimeclient/__init__.py +756 -0
- praisonai/ui/realtimeclient/tools.py +242 -0
- praisonai/ui/sql_alchemy.py +710 -0
- praisonai/upload_vision.py +140 -0
- praisonai/version.py +1 -0
- praisonai-3.0.0.dist-info/METADATA +3493 -0
- praisonai-3.0.0.dist-info/RECORD +393 -0
- praisonai-3.0.0.dist-info/WHEEL +5 -0
- praisonai-3.0.0.dist-info/entry_points.txt +4 -0
- 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)")
|