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,291 @@
|
|
|
1
|
+
"""
|
|
2
|
+
LangChain VectorStore adapter implementation of KnowledgeStore.
|
|
3
|
+
|
|
4
|
+
Wraps any LangChain VectorStore for use with PraisonAI.
|
|
5
|
+
|
|
6
|
+
Requires: langchain-core
|
|
7
|
+
Install: pip install langchain-core
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from typing import Any, Dict, List, Optional
|
|
12
|
+
|
|
13
|
+
from .base import KnowledgeStore, KnowledgeDocument
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class LangChainKnowledgeStore(KnowledgeStore):
|
|
19
|
+
"""
|
|
20
|
+
LangChain VectorStore adapter for knowledge/RAG.
|
|
21
|
+
|
|
22
|
+
Wraps any LangChain VectorStore for use with PraisonAI's interface.
|
|
23
|
+
|
|
24
|
+
Example:
|
|
25
|
+
from langchain_chroma import Chroma
|
|
26
|
+
|
|
27
|
+
lc_store = Chroma(persist_directory="./chroma_db")
|
|
28
|
+
store = LangChainKnowledgeStore(vectorstore=lc_store)
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
vectorstore: Any = None,
|
|
34
|
+
vectorstore_cls: Optional[str] = None,
|
|
35
|
+
vectorstore_kwargs: Optional[Dict[str, Any]] = None,
|
|
36
|
+
):
|
|
37
|
+
"""
|
|
38
|
+
Initialize LangChain adapter.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
vectorstore: Pre-initialized LangChain VectorStore instance
|
|
42
|
+
vectorstore_cls: Class name to import (e.g., "langchain_chroma.Chroma")
|
|
43
|
+
vectorstore_kwargs: Kwargs for vectorstore initialization
|
|
44
|
+
"""
|
|
45
|
+
self._vectorstore = vectorstore
|
|
46
|
+
self._vectorstore_cls = vectorstore_cls
|
|
47
|
+
self._vectorstore_kwargs = vectorstore_kwargs or {}
|
|
48
|
+
self._initialized = vectorstore is not None
|
|
49
|
+
|
|
50
|
+
def _init_client(self):
|
|
51
|
+
"""Initialize vectorstore lazily."""
|
|
52
|
+
if self._initialized:
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
if not self._vectorstore_cls:
|
|
56
|
+
raise ValueError(
|
|
57
|
+
"Either vectorstore or vectorstore_cls must be provided"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Dynamic import of vectorstore class
|
|
61
|
+
parts = self._vectorstore_cls.rsplit(".", 1)
|
|
62
|
+
if len(parts) == 2:
|
|
63
|
+
module_name, class_name = parts
|
|
64
|
+
import importlib
|
|
65
|
+
module = importlib.import_module(module_name)
|
|
66
|
+
cls = getattr(module, class_name)
|
|
67
|
+
self._vectorstore = cls(**self._vectorstore_kwargs)
|
|
68
|
+
else:
|
|
69
|
+
raise ValueError(f"Invalid vectorstore_cls: {self._vectorstore_cls}")
|
|
70
|
+
|
|
71
|
+
self._initialized = True
|
|
72
|
+
|
|
73
|
+
def create_collection(
|
|
74
|
+
self,
|
|
75
|
+
name: str,
|
|
76
|
+
dimension: int = 1536,
|
|
77
|
+
distance: str = "cosine",
|
|
78
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
79
|
+
) -> None:
|
|
80
|
+
"""Create collection (handled by underlying vectorstore)."""
|
|
81
|
+
self._init_client()
|
|
82
|
+
logger.info(f"Collection creation handled by LangChain vectorstore")
|
|
83
|
+
|
|
84
|
+
def delete_collection(self, name: str) -> bool:
|
|
85
|
+
"""Delete collection."""
|
|
86
|
+
self._init_client()
|
|
87
|
+
try:
|
|
88
|
+
if hasattr(self._vectorstore, 'delete_collection'):
|
|
89
|
+
self._vectorstore.delete_collection()
|
|
90
|
+
return True
|
|
91
|
+
logger.warning("Underlying vectorstore doesn't support delete_collection")
|
|
92
|
+
return False
|
|
93
|
+
except Exception as e:
|
|
94
|
+
logger.error(f"Failed to delete collection: {e}")
|
|
95
|
+
return False
|
|
96
|
+
|
|
97
|
+
def collection_exists(self, name: str) -> bool:
|
|
98
|
+
"""Check if collection exists."""
|
|
99
|
+
self._init_client()
|
|
100
|
+
return self._vectorstore is not None
|
|
101
|
+
|
|
102
|
+
def list_collections(self) -> List[str]:
|
|
103
|
+
"""List collections."""
|
|
104
|
+
self._init_client()
|
|
105
|
+
if hasattr(self._vectorstore, 'list_collections'):
|
|
106
|
+
return self._vectorstore.list_collections()
|
|
107
|
+
return ["default"]
|
|
108
|
+
|
|
109
|
+
def insert(
|
|
110
|
+
self,
|
|
111
|
+
collection: str,
|
|
112
|
+
documents: List[KnowledgeDocument]
|
|
113
|
+
) -> List[str]:
|
|
114
|
+
"""Insert documents."""
|
|
115
|
+
self._init_client()
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
from langchain_core.documents import Document as LCDocument
|
|
119
|
+
except ImportError:
|
|
120
|
+
raise ImportError(
|
|
121
|
+
"langchain-core is required. Install with: pip install langchain-core"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
lc_docs = []
|
|
125
|
+
ids = []
|
|
126
|
+
for doc in documents:
|
|
127
|
+
lc_doc = LCDocument(
|
|
128
|
+
page_content=doc.content,
|
|
129
|
+
metadata={
|
|
130
|
+
**(doc.metadata or {}),
|
|
131
|
+
"id": doc.id,
|
|
132
|
+
"content_hash": doc.content_hash,
|
|
133
|
+
"created_at": doc.created_at,
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
lc_docs.append(lc_doc)
|
|
137
|
+
ids.append(doc.id)
|
|
138
|
+
|
|
139
|
+
if hasattr(self._vectorstore, 'add_documents'):
|
|
140
|
+
self._vectorstore.add_documents(lc_docs, ids=ids)
|
|
141
|
+
else:
|
|
142
|
+
logger.warning("Vectorstore doesn't support add_documents")
|
|
143
|
+
|
|
144
|
+
return ids
|
|
145
|
+
|
|
146
|
+
def upsert(
|
|
147
|
+
self,
|
|
148
|
+
collection: str,
|
|
149
|
+
documents: List[KnowledgeDocument]
|
|
150
|
+
) -> List[str]:
|
|
151
|
+
"""Upsert documents."""
|
|
152
|
+
# Most LangChain vectorstores handle upsert via add_documents
|
|
153
|
+
return self.insert(collection, documents)
|
|
154
|
+
|
|
155
|
+
def search(
|
|
156
|
+
self,
|
|
157
|
+
collection: str,
|
|
158
|
+
query_embedding: List[float],
|
|
159
|
+
limit: int = 5,
|
|
160
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
161
|
+
score_threshold: Optional[float] = None
|
|
162
|
+
) -> List[KnowledgeDocument]:
|
|
163
|
+
"""Search for similar documents."""
|
|
164
|
+
self._init_client()
|
|
165
|
+
|
|
166
|
+
try:
|
|
167
|
+
if hasattr(self._vectorstore, 'similarity_search_by_vector'):
|
|
168
|
+
results = self._vectorstore.similarity_search_by_vector(
|
|
169
|
+
query_embedding,
|
|
170
|
+
k=limit,
|
|
171
|
+
filter=filters
|
|
172
|
+
)
|
|
173
|
+
else:
|
|
174
|
+
logger.warning("Vectorstore doesn't support vector search")
|
|
175
|
+
return []
|
|
176
|
+
|
|
177
|
+
documents = []
|
|
178
|
+
for lc_doc in results:
|
|
179
|
+
metadata = lc_doc.metadata or {}
|
|
180
|
+
documents.append(KnowledgeDocument(
|
|
181
|
+
id=metadata.get("id", ""),
|
|
182
|
+
content=lc_doc.page_content,
|
|
183
|
+
metadata=metadata,
|
|
184
|
+
content_hash=metadata.get("content_hash"),
|
|
185
|
+
created_at=metadata.get("created_at", 0)
|
|
186
|
+
))
|
|
187
|
+
|
|
188
|
+
return documents
|
|
189
|
+
except Exception as e:
|
|
190
|
+
logger.error(f"Search failed: {e}")
|
|
191
|
+
return []
|
|
192
|
+
|
|
193
|
+
def similarity_search(
|
|
194
|
+
self,
|
|
195
|
+
query_text: str,
|
|
196
|
+
limit: int = 5,
|
|
197
|
+
filters: Optional[Dict[str, Any]] = None
|
|
198
|
+
) -> List[KnowledgeDocument]:
|
|
199
|
+
"""
|
|
200
|
+
Text-based similarity search (native LangChain method).
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
query_text: Query string
|
|
204
|
+
limit: Maximum results
|
|
205
|
+
filters: Metadata filters
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
List of matching documents
|
|
209
|
+
"""
|
|
210
|
+
self._init_client()
|
|
211
|
+
|
|
212
|
+
try:
|
|
213
|
+
results = self._vectorstore.similarity_search(
|
|
214
|
+
query_text,
|
|
215
|
+
k=limit,
|
|
216
|
+
filter=filters
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
documents = []
|
|
220
|
+
for lc_doc in results:
|
|
221
|
+
metadata = lc_doc.metadata or {}
|
|
222
|
+
documents.append(KnowledgeDocument(
|
|
223
|
+
id=metadata.get("id", ""),
|
|
224
|
+
content=lc_doc.page_content,
|
|
225
|
+
metadata=metadata,
|
|
226
|
+
content_hash=metadata.get("content_hash"),
|
|
227
|
+
created_at=metadata.get("created_at", 0)
|
|
228
|
+
))
|
|
229
|
+
|
|
230
|
+
return documents
|
|
231
|
+
except Exception as e:
|
|
232
|
+
logger.error(f"Similarity search failed: {e}")
|
|
233
|
+
return []
|
|
234
|
+
|
|
235
|
+
def get(
|
|
236
|
+
self,
|
|
237
|
+
collection: str,
|
|
238
|
+
ids: List[str]
|
|
239
|
+
) -> List[KnowledgeDocument]:
|
|
240
|
+
"""Get documents by IDs."""
|
|
241
|
+
self._init_client()
|
|
242
|
+
|
|
243
|
+
if hasattr(self._vectorstore, 'get'):
|
|
244
|
+
try:
|
|
245
|
+
results = self._vectorstore.get(ids)
|
|
246
|
+
documents = []
|
|
247
|
+
for lc_doc in results:
|
|
248
|
+
metadata = lc_doc.metadata or {}
|
|
249
|
+
documents.append(KnowledgeDocument(
|
|
250
|
+
id=metadata.get("id", ""),
|
|
251
|
+
content=lc_doc.page_content,
|
|
252
|
+
metadata=metadata
|
|
253
|
+
))
|
|
254
|
+
return documents
|
|
255
|
+
except Exception as e:
|
|
256
|
+
logger.warning(f"Get by ID failed: {e}")
|
|
257
|
+
|
|
258
|
+
return []
|
|
259
|
+
|
|
260
|
+
def delete(
|
|
261
|
+
self,
|
|
262
|
+
collection: str,
|
|
263
|
+
ids: Optional[List[str]] = None,
|
|
264
|
+
filters: Optional[Dict[str, Any]] = None
|
|
265
|
+
) -> int:
|
|
266
|
+
"""Delete documents."""
|
|
267
|
+
self._init_client()
|
|
268
|
+
|
|
269
|
+
if ids and hasattr(self._vectorstore, 'delete'):
|
|
270
|
+
try:
|
|
271
|
+
self._vectorstore.delete(ids)
|
|
272
|
+
return len(ids)
|
|
273
|
+
except Exception as e:
|
|
274
|
+
logger.error(f"Delete failed: {e}")
|
|
275
|
+
|
|
276
|
+
return 0
|
|
277
|
+
|
|
278
|
+
def count(self, collection: str) -> int:
|
|
279
|
+
"""Count documents."""
|
|
280
|
+
self._init_client()
|
|
281
|
+
|
|
282
|
+
if hasattr(self._vectorstore, '__len__'):
|
|
283
|
+
return len(self._vectorstore)
|
|
284
|
+
|
|
285
|
+
logger.warning("Vectorstore doesn't support counting")
|
|
286
|
+
return -1
|
|
287
|
+
|
|
288
|
+
def close(self) -> None:
|
|
289
|
+
"""Close the client."""
|
|
290
|
+
self._vectorstore = None
|
|
291
|
+
self._initialized = False
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"""
|
|
2
|
+
LightRAG adapter implementation of KnowledgeStore.
|
|
3
|
+
|
|
4
|
+
Requires: lightrag
|
|
5
|
+
Install: pip install lightrag
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Any, Dict, List, Optional
|
|
10
|
+
|
|
11
|
+
from .base import KnowledgeStore, KnowledgeDocument
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class LightRAGKnowledgeStore(KnowledgeStore):
|
|
17
|
+
"""
|
|
18
|
+
LightRAG adapter for knowledge/RAG.
|
|
19
|
+
|
|
20
|
+
Wraps LightRAG for use with PraisonAI's KnowledgeStore interface.
|
|
21
|
+
|
|
22
|
+
Example:
|
|
23
|
+
store = LightRAGKnowledgeStore(
|
|
24
|
+
working_dir="./lightrag_data"
|
|
25
|
+
)
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
working_dir: str = "./lightrag_data",
|
|
31
|
+
llm_model: str = "gpt-4o-mini",
|
|
32
|
+
embedding_model: str = "text-embedding-3-small",
|
|
33
|
+
**kwargs
|
|
34
|
+
):
|
|
35
|
+
"""
|
|
36
|
+
Initialize LightRAG adapter.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
working_dir: Directory for LightRAG data
|
|
40
|
+
llm_model: LLM model for graph extraction
|
|
41
|
+
embedding_model: Embedding model name
|
|
42
|
+
**kwargs: Additional LightRAG options
|
|
43
|
+
"""
|
|
44
|
+
self.working_dir = working_dir
|
|
45
|
+
self.llm_model = llm_model
|
|
46
|
+
self.embedding_model = embedding_model
|
|
47
|
+
self.kwargs = kwargs
|
|
48
|
+
|
|
49
|
+
self._rag = None
|
|
50
|
+
self._initialized = False
|
|
51
|
+
|
|
52
|
+
def _init_client(self):
|
|
53
|
+
"""Initialize LightRAG client lazily."""
|
|
54
|
+
if self._initialized:
|
|
55
|
+
return
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
from lightrag import LightRAG, QueryParam
|
|
59
|
+
from lightrag.llm import gpt_4o_mini_complete, openai_embedding
|
|
60
|
+
except ImportError:
|
|
61
|
+
raise ImportError(
|
|
62
|
+
"lightrag is required for LightRAG support. "
|
|
63
|
+
"Install with: pip install lightrag"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
self._QueryParam = QueryParam
|
|
67
|
+
self._rag = LightRAG(
|
|
68
|
+
working_dir=self.working_dir,
|
|
69
|
+
llm_model_func=gpt_4o_mini_complete,
|
|
70
|
+
embedding_func=openai_embedding,
|
|
71
|
+
**self.kwargs
|
|
72
|
+
)
|
|
73
|
+
self._initialized = True
|
|
74
|
+
|
|
75
|
+
def create_collection(
|
|
76
|
+
self,
|
|
77
|
+
name: str,
|
|
78
|
+
dimension: int = 1536,
|
|
79
|
+
distance: str = "cosine",
|
|
80
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
81
|
+
) -> None:
|
|
82
|
+
"""Create collection (LightRAG uses working directory)."""
|
|
83
|
+
self._init_client()
|
|
84
|
+
logger.info(f"LightRAG uses working_dir: {self.working_dir}")
|
|
85
|
+
|
|
86
|
+
def delete_collection(self, name: str) -> bool:
|
|
87
|
+
"""Delete collection data."""
|
|
88
|
+
import shutil
|
|
89
|
+
import os
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
if os.path.exists(self.working_dir):
|
|
93
|
+
shutil.rmtree(self.working_dir)
|
|
94
|
+
return True
|
|
95
|
+
except Exception as e:
|
|
96
|
+
logger.error(f"Failed to delete collection: {e}")
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
def collection_exists(self, name: str) -> bool:
|
|
100
|
+
"""Check if working directory exists."""
|
|
101
|
+
import os
|
|
102
|
+
return os.path.exists(self.working_dir)
|
|
103
|
+
|
|
104
|
+
def list_collections(self) -> List[str]:
|
|
105
|
+
"""List collections (single collection per working_dir)."""
|
|
106
|
+
import os
|
|
107
|
+
if os.path.exists(self.working_dir):
|
|
108
|
+
return ["default"]
|
|
109
|
+
return []
|
|
110
|
+
|
|
111
|
+
def insert(
|
|
112
|
+
self,
|
|
113
|
+
collection: str,
|
|
114
|
+
documents: List[KnowledgeDocument]
|
|
115
|
+
) -> List[str]:
|
|
116
|
+
"""Insert documents into LightRAG."""
|
|
117
|
+
self._init_client()
|
|
118
|
+
|
|
119
|
+
ids = []
|
|
120
|
+
for doc in documents:
|
|
121
|
+
try:
|
|
122
|
+
self._rag.insert(doc.content)
|
|
123
|
+
ids.append(doc.id)
|
|
124
|
+
except Exception as e:
|
|
125
|
+
logger.warning(f"Failed to insert document {doc.id}: {e}")
|
|
126
|
+
|
|
127
|
+
return ids
|
|
128
|
+
|
|
129
|
+
def upsert(
|
|
130
|
+
self,
|
|
131
|
+
collection: str,
|
|
132
|
+
documents: List[KnowledgeDocument]
|
|
133
|
+
) -> List[str]:
|
|
134
|
+
"""Upsert documents (same as insert for LightRAG)."""
|
|
135
|
+
return self.insert(collection, documents)
|
|
136
|
+
|
|
137
|
+
def search(
|
|
138
|
+
self,
|
|
139
|
+
collection: str,
|
|
140
|
+
query_embedding: List[float],
|
|
141
|
+
limit: int = 5,
|
|
142
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
143
|
+
score_threshold: Optional[float] = None
|
|
144
|
+
) -> List[KnowledgeDocument]:
|
|
145
|
+
"""Search using LightRAG's query method."""
|
|
146
|
+
self._init_client()
|
|
147
|
+
|
|
148
|
+
# LightRAG uses text query, not embeddings directly
|
|
149
|
+
# This is a limitation - we need the original query text
|
|
150
|
+
logger.warning(
|
|
151
|
+
"LightRAG search requires text query, not embeddings. "
|
|
152
|
+
"Use query() method directly for best results."
|
|
153
|
+
)
|
|
154
|
+
return []
|
|
155
|
+
|
|
156
|
+
def query(
|
|
157
|
+
self,
|
|
158
|
+
query_text: str,
|
|
159
|
+
mode: str = "hybrid",
|
|
160
|
+
limit: int = 5
|
|
161
|
+
) -> str:
|
|
162
|
+
"""
|
|
163
|
+
Query LightRAG with text (native method).
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
query_text: The query string
|
|
167
|
+
mode: Query mode (naive, local, global, hybrid)
|
|
168
|
+
limit: Maximum results
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
Query response as string
|
|
172
|
+
"""
|
|
173
|
+
self._init_client()
|
|
174
|
+
|
|
175
|
+
try:
|
|
176
|
+
result = self._rag.query(
|
|
177
|
+
query_text,
|
|
178
|
+
param=self._QueryParam(mode=mode, top_k=limit)
|
|
179
|
+
)
|
|
180
|
+
return result
|
|
181
|
+
except Exception as e:
|
|
182
|
+
logger.error(f"Query failed: {e}")
|
|
183
|
+
return ""
|
|
184
|
+
|
|
185
|
+
def get(
|
|
186
|
+
self,
|
|
187
|
+
collection: str,
|
|
188
|
+
ids: List[str]
|
|
189
|
+
) -> List[KnowledgeDocument]:
|
|
190
|
+
"""Get documents by IDs (not supported by LightRAG)."""
|
|
191
|
+
logger.warning("LightRAG does not support get by ID")
|
|
192
|
+
return []
|
|
193
|
+
|
|
194
|
+
def delete(
|
|
195
|
+
self,
|
|
196
|
+
collection: str,
|
|
197
|
+
ids: Optional[List[str]] = None,
|
|
198
|
+
filters: Optional[Dict[str, Any]] = None
|
|
199
|
+
) -> int:
|
|
200
|
+
"""Delete documents (not directly supported)."""
|
|
201
|
+
logger.warning("LightRAG does not support individual document deletion")
|
|
202
|
+
return 0
|
|
203
|
+
|
|
204
|
+
def count(self, collection: str) -> int:
|
|
205
|
+
"""Count documents (not directly supported)."""
|
|
206
|
+
logger.warning("LightRAG does not support document counting")
|
|
207
|
+
return -1
|
|
208
|
+
|
|
209
|
+
def close(self) -> None:
|
|
210
|
+
"""Close the client."""
|
|
211
|
+
self._rag = None
|
|
212
|
+
self._initialized = False
|