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,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()
|