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,531 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Handler for CLI.
|
|
3
|
+
|
|
4
|
+
Provides RAG/vector store management with full knowledge stack support.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
praisonai knowledge add document.pdf
|
|
8
|
+
praisonai knowledge add ./docs/
|
|
9
|
+
praisonai knowledge query "How to authenticate?"
|
|
10
|
+
praisonai knowledge list
|
|
11
|
+
praisonai knowledge clear
|
|
12
|
+
praisonai knowledge stats
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
from typing import Any, Dict, List, Optional
|
|
17
|
+
from .base import CommandHandler
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class KnowledgeHandler(CommandHandler):
|
|
21
|
+
"""
|
|
22
|
+
Handler for knowledge command.
|
|
23
|
+
|
|
24
|
+
Manages knowledge base for RAG (Retrieval Augmented Generation).
|
|
25
|
+
|
|
26
|
+
Supports:
|
|
27
|
+
- Multiple vector stores (chroma, pinecone, qdrant, weaviate, memory)
|
|
28
|
+
- Retrieval strategies (basic, fusion, recursive, auto_merge)
|
|
29
|
+
- Rerankers (simple, llm, cross_encoder, cohere)
|
|
30
|
+
- Index types (vector, keyword, hybrid)
|
|
31
|
+
- Query modes (default, sub_question, summarize)
|
|
32
|
+
|
|
33
|
+
Example:
|
|
34
|
+
praisonai knowledge add document.pdf
|
|
35
|
+
praisonai knowledge add ./docs/
|
|
36
|
+
praisonai knowledge query "How to authenticate?" --retrieval fusion
|
|
37
|
+
praisonai knowledge list
|
|
38
|
+
praisonai knowledge clear
|
|
39
|
+
praisonai knowledge stats
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
verbose: bool = False,
|
|
45
|
+
workspace: str = None,
|
|
46
|
+
vector_store: str = "chroma",
|
|
47
|
+
retrieval_strategy: str = "basic",
|
|
48
|
+
reranker: Optional[str] = None,
|
|
49
|
+
index_type: str = "vector",
|
|
50
|
+
query_mode: str = "default",
|
|
51
|
+
session_id: Optional[str] = None,
|
|
52
|
+
db: Optional[str] = None
|
|
53
|
+
):
|
|
54
|
+
super().__init__(verbose)
|
|
55
|
+
self.workspace = workspace or os.getcwd()
|
|
56
|
+
self.vector_store = vector_store
|
|
57
|
+
self.retrieval_strategy = retrieval_strategy
|
|
58
|
+
self.reranker = reranker
|
|
59
|
+
self.index_type = index_type
|
|
60
|
+
self.query_mode = query_mode
|
|
61
|
+
self.session_id = session_id
|
|
62
|
+
self.db = db
|
|
63
|
+
self._knowledge = None
|
|
64
|
+
self._embedding_fn = None
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def feature_name(self) -> str:
|
|
68
|
+
return "knowledge"
|
|
69
|
+
|
|
70
|
+
def get_actions(self) -> List[str]:
|
|
71
|
+
return ["add", "query", "search", "list", "clear", "stats", "info", "export", "import", "help"]
|
|
72
|
+
|
|
73
|
+
def get_help_text(self) -> str:
|
|
74
|
+
return """
|
|
75
|
+
Knowledge Commands:
|
|
76
|
+
praisonai knowledge add <file|dir|url> - Add document(s) to knowledge base
|
|
77
|
+
praisonai knowledge query "<question>" - Query knowledge base with RAG
|
|
78
|
+
praisonai knowledge list - List indexed documents
|
|
79
|
+
praisonai knowledge clear - Clear knowledge base
|
|
80
|
+
praisonai knowledge stats - Show knowledge base statistics
|
|
81
|
+
praisonai knowledge export <file.json> - Export knowledge base to JSON file
|
|
82
|
+
praisonai knowledge import <file.json> - Import knowledge base from JSON file
|
|
83
|
+
praisonai knowledge help - Show this help message
|
|
84
|
+
|
|
85
|
+
Options:
|
|
86
|
+
--workspace <path> - Workspace directory (default: current)
|
|
87
|
+
--vector-store <name> - Vector store backend
|
|
88
|
+
Values: memory, chroma, pinecone, qdrant, weaviate
|
|
89
|
+
Default: chroma
|
|
90
|
+
--retrieval-strategy <strategy> - Retrieval strategy
|
|
91
|
+
Values: basic, fusion, recursive, auto_merge
|
|
92
|
+
Default: basic
|
|
93
|
+
--reranker <name> - Reranker for result ordering
|
|
94
|
+
Values: none, simple, llm, cross_encoder, cohere
|
|
95
|
+
Default: none
|
|
96
|
+
--index-type <type> - Index type for search
|
|
97
|
+
Values: vector, keyword, hybrid
|
|
98
|
+
Default: vector
|
|
99
|
+
--query-mode <mode> - Query processing mode
|
|
100
|
+
Values: default, sub_question, summarize
|
|
101
|
+
Default: default
|
|
102
|
+
--session <id> - Session ID for persistence
|
|
103
|
+
--db <path> - Database path for persistence
|
|
104
|
+
|
|
105
|
+
Examples:
|
|
106
|
+
praisonai knowledge add document.pdf
|
|
107
|
+
praisonai knowledge add ./docs/
|
|
108
|
+
praisonai knowledge query "How to authenticate?" --retrieval-strategy fusion
|
|
109
|
+
praisonai knowledge query "Compare approaches" --reranker simple --query-mode sub_question
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
def _get_knowledge(self):
|
|
113
|
+
"""Lazy load Knowledge instance with configured options."""
|
|
114
|
+
if self._knowledge is None:
|
|
115
|
+
try:
|
|
116
|
+
from praisonaiagents import Knowledge
|
|
117
|
+
|
|
118
|
+
# Build config based on options
|
|
119
|
+
config = {
|
|
120
|
+
"vector_store": {
|
|
121
|
+
"provider": self.vector_store,
|
|
122
|
+
"config": {
|
|
123
|
+
"path": os.path.join(self.workspace, ".praison", "knowledge")
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
self._knowledge = Knowledge(config=config)
|
|
129
|
+
except ImportError:
|
|
130
|
+
self.print_status(
|
|
131
|
+
"Knowledge requires praisonaiagents. Install with: pip install praisonaiagents[knowledge]",
|
|
132
|
+
"error"
|
|
133
|
+
)
|
|
134
|
+
return None
|
|
135
|
+
return self._knowledge
|
|
136
|
+
|
|
137
|
+
def _get_embedding_fn(self):
|
|
138
|
+
"""Get embedding function."""
|
|
139
|
+
if self._embedding_fn is None:
|
|
140
|
+
try:
|
|
141
|
+
import openai
|
|
142
|
+
client = openai.OpenAI()
|
|
143
|
+
|
|
144
|
+
def embed(text: str) -> List[float]:
|
|
145
|
+
response = client.embeddings.create(
|
|
146
|
+
input=text,
|
|
147
|
+
model="text-embedding-3-small"
|
|
148
|
+
)
|
|
149
|
+
return response.data[0].embedding
|
|
150
|
+
|
|
151
|
+
self._embedding_fn = embed
|
|
152
|
+
except Exception as e:
|
|
153
|
+
self.print_status(f"Failed to initialize embeddings: {e}", "warning")
|
|
154
|
+
return self._embedding_fn
|
|
155
|
+
|
|
156
|
+
def action_add(self, args: List[str], **kwargs) -> bool:
|
|
157
|
+
"""
|
|
158
|
+
Add document(s) to knowledge base.
|
|
159
|
+
|
|
160
|
+
Supports:
|
|
161
|
+
- File paths (pdf, docx, txt, md, html, etc.)
|
|
162
|
+
- Directories (recursive)
|
|
163
|
+
- Glob patterns (*.pdf, docs/**/*.md)
|
|
164
|
+
- URLs (http://, https://)
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
args: List containing file/directory/URL paths
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
True if successful
|
|
171
|
+
"""
|
|
172
|
+
if not args:
|
|
173
|
+
self.print_status("Usage: praisonai knowledge add <file|directory|url|glob>", "error")
|
|
174
|
+
return False
|
|
175
|
+
|
|
176
|
+
knowledge = self._get_knowledge()
|
|
177
|
+
if not knowledge:
|
|
178
|
+
return False
|
|
179
|
+
|
|
180
|
+
source = args[0]
|
|
181
|
+
|
|
182
|
+
# Check if URL
|
|
183
|
+
if source.startswith(("http://", "https://")):
|
|
184
|
+
try:
|
|
185
|
+
knowledge.add(source)
|
|
186
|
+
self.print_status(f"✅ Added URL: {source}", "success")
|
|
187
|
+
return True
|
|
188
|
+
except Exception as e:
|
|
189
|
+
self.print_status(f"Failed to add URL: {e}", "error")
|
|
190
|
+
return False
|
|
191
|
+
|
|
192
|
+
# Expand path
|
|
193
|
+
if not os.path.isabs(source):
|
|
194
|
+
source = os.path.join(self.workspace, source)
|
|
195
|
+
|
|
196
|
+
# Check for glob pattern
|
|
197
|
+
if "*" in source or "?" in source:
|
|
198
|
+
import glob
|
|
199
|
+
files = glob.glob(source, recursive=True)
|
|
200
|
+
if not files:
|
|
201
|
+
self.print_status(f"No files match pattern: {source}", "warning")
|
|
202
|
+
return False
|
|
203
|
+
|
|
204
|
+
count = 0
|
|
205
|
+
for file_path in files:
|
|
206
|
+
if os.path.isfile(file_path):
|
|
207
|
+
try:
|
|
208
|
+
knowledge.add(file_path)
|
|
209
|
+
count += 1
|
|
210
|
+
except Exception as e:
|
|
211
|
+
self.print_status(f"Failed to add {file_path}: {e}", "warning")
|
|
212
|
+
|
|
213
|
+
self.print_status(f"✅ Added {count} files matching {args[0]}", "success")
|
|
214
|
+
return True
|
|
215
|
+
|
|
216
|
+
if not os.path.exists(source):
|
|
217
|
+
self.print_status(f"Path not found: {source}", "error")
|
|
218
|
+
return False
|
|
219
|
+
|
|
220
|
+
try:
|
|
221
|
+
if os.path.isdir(source):
|
|
222
|
+
# Add all files in directory
|
|
223
|
+
count = 0
|
|
224
|
+
for root, _, files in os.walk(source):
|
|
225
|
+
for file in files:
|
|
226
|
+
file_path = os.path.join(root, file)
|
|
227
|
+
try:
|
|
228
|
+
knowledge.add(file_path)
|
|
229
|
+
count += 1
|
|
230
|
+
except Exception as e:
|
|
231
|
+
if self.verbose:
|
|
232
|
+
self.print_status(f"Skipped {file}: {e}", "warning")
|
|
233
|
+
self.print_status(f"✅ Added {count} files from {source}", "success")
|
|
234
|
+
else:
|
|
235
|
+
knowledge.add(source)
|
|
236
|
+
self.print_status(f"✅ Added: {source}", "success")
|
|
237
|
+
return True
|
|
238
|
+
except Exception as e:
|
|
239
|
+
self.print_status(f"Failed to add: {e}", "error")
|
|
240
|
+
return False
|
|
241
|
+
|
|
242
|
+
def action_search(self, args: List[str], **kwargs) -> List[Dict[str, Any]]:
|
|
243
|
+
"""Alias for action_query."""
|
|
244
|
+
return self.action_query(args, **kwargs)
|
|
245
|
+
|
|
246
|
+
def action_query(self, args: List[str], **kwargs) -> List[Dict[str, Any]]:
|
|
247
|
+
"""
|
|
248
|
+
Query knowledge base with RAG.
|
|
249
|
+
|
|
250
|
+
Uses configured retrieval strategy, reranker, and query mode.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
args: List containing query
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
List of results with answer and sources
|
|
257
|
+
"""
|
|
258
|
+
if not args:
|
|
259
|
+
self.print_status("Usage: praisonai knowledge query <question>", "error")
|
|
260
|
+
return []
|
|
261
|
+
|
|
262
|
+
knowledge = self._get_knowledge()
|
|
263
|
+
if not knowledge:
|
|
264
|
+
return []
|
|
265
|
+
|
|
266
|
+
query = ' '.join(args)
|
|
267
|
+
limit = kwargs.get('limit', 5)
|
|
268
|
+
|
|
269
|
+
try:
|
|
270
|
+
# Use knowledge.search for basic retrieval
|
|
271
|
+
results = knowledge.search(query, limit=limit)
|
|
272
|
+
|
|
273
|
+
if results:
|
|
274
|
+
self.print_status(f"\n🔍 Results for '{query}':\n", "info")
|
|
275
|
+
for i, result in enumerate(results, 1):
|
|
276
|
+
if isinstance(result, dict):
|
|
277
|
+
content = result.get('memory', result.get('text', str(result)))[:200]
|
|
278
|
+
score = result.get('score', 'N/A')
|
|
279
|
+
self.print_status(f" {i}. [score: {score}] {content}...", "info")
|
|
280
|
+
else:
|
|
281
|
+
content = str(result)[:200]
|
|
282
|
+
self.print_status(f" {i}. {content}...", "info")
|
|
283
|
+
else:
|
|
284
|
+
self.print_status("No results found", "warning")
|
|
285
|
+
|
|
286
|
+
return results
|
|
287
|
+
except Exception as e:
|
|
288
|
+
self.print_status(f"Query failed: {e}", "error")
|
|
289
|
+
return []
|
|
290
|
+
|
|
291
|
+
def action_list(self, args: List[str], **kwargs) -> List[str]:
|
|
292
|
+
"""
|
|
293
|
+
List indexed documents.
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
List of document names
|
|
297
|
+
"""
|
|
298
|
+
knowledge = self._get_knowledge()
|
|
299
|
+
if not knowledge:
|
|
300
|
+
return []
|
|
301
|
+
|
|
302
|
+
try:
|
|
303
|
+
if hasattr(knowledge, 'list_documents'):
|
|
304
|
+
docs = knowledge.list_documents()
|
|
305
|
+
elif hasattr(knowledge, 'documents'):
|
|
306
|
+
docs = list(knowledge.documents.keys()) if knowledge.documents else []
|
|
307
|
+
else:
|
|
308
|
+
docs = []
|
|
309
|
+
|
|
310
|
+
if docs:
|
|
311
|
+
self.print_status("\n📚 Indexed Documents:", "info")
|
|
312
|
+
for doc in docs:
|
|
313
|
+
self.print_status(f" - {doc}", "info")
|
|
314
|
+
else:
|
|
315
|
+
self.print_status("No documents indexed", "warning")
|
|
316
|
+
|
|
317
|
+
return docs
|
|
318
|
+
except Exception as e:
|
|
319
|
+
self.print_status(f"Failed to list documents: {e}", "error")
|
|
320
|
+
return []
|
|
321
|
+
|
|
322
|
+
def action_clear(self, args: List[str], **kwargs) -> bool:
|
|
323
|
+
"""
|
|
324
|
+
Clear knowledge base.
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
True if successful
|
|
328
|
+
"""
|
|
329
|
+
knowledge = self._get_knowledge()
|
|
330
|
+
if not knowledge:
|
|
331
|
+
return False
|
|
332
|
+
|
|
333
|
+
try:
|
|
334
|
+
if hasattr(knowledge, 'clear'):
|
|
335
|
+
knowledge.clear()
|
|
336
|
+
elif hasattr(knowledge, 'reset'):
|
|
337
|
+
knowledge.reset()
|
|
338
|
+
|
|
339
|
+
self.print_status("✅ Knowledge base cleared", "success")
|
|
340
|
+
return True
|
|
341
|
+
except Exception as e:
|
|
342
|
+
self.print_status(f"Failed to clear: {e}", "error")
|
|
343
|
+
return False
|
|
344
|
+
|
|
345
|
+
def action_stats(self, args: List[str], **kwargs) -> Dict[str, Any]:
|
|
346
|
+
"""
|
|
347
|
+
Show knowledge base statistics.
|
|
348
|
+
|
|
349
|
+
Returns:
|
|
350
|
+
Dictionary of statistics
|
|
351
|
+
"""
|
|
352
|
+
knowledge = self._get_knowledge()
|
|
353
|
+
if not knowledge:
|
|
354
|
+
return {}
|
|
355
|
+
|
|
356
|
+
stats = {
|
|
357
|
+
"workspace": self.workspace,
|
|
358
|
+
"vector_store": self.vector_store,
|
|
359
|
+
"retrieval_strategy": self.retrieval_strategy,
|
|
360
|
+
"reranker": self.reranker or "none",
|
|
361
|
+
"index_type": self.index_type,
|
|
362
|
+
"query_mode": self.query_mode
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
try:
|
|
366
|
+
# Try to get document count from memory
|
|
367
|
+
if hasattr(knowledge, 'memory'):
|
|
368
|
+
mem = knowledge.memory
|
|
369
|
+
if hasattr(mem, 'get_all'):
|
|
370
|
+
all_docs = mem.get_all()
|
|
371
|
+
stats['document_count'] = len(all_docs) if all_docs else 0
|
|
372
|
+
except Exception:
|
|
373
|
+
pass
|
|
374
|
+
|
|
375
|
+
self.print_status("\n📊 Knowledge Base Statistics:", "info")
|
|
376
|
+
for key, value in stats.items():
|
|
377
|
+
self.print_status(f" {key}: {value}", "info")
|
|
378
|
+
|
|
379
|
+
return stats
|
|
380
|
+
|
|
381
|
+
def action_info(self, args: List[str], **kwargs) -> Dict[str, Any]:
|
|
382
|
+
"""Alias for action_stats."""
|
|
383
|
+
return self.action_stats(args, **kwargs)
|
|
384
|
+
|
|
385
|
+
def action_export(self, args: List[str], **kwargs) -> bool:
|
|
386
|
+
"""
|
|
387
|
+
Export knowledge base to JSON file.
|
|
388
|
+
|
|
389
|
+
Exports all documents with their metadata, embeddings, and content
|
|
390
|
+
for backup or migration purposes.
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
args: List containing output file path
|
|
394
|
+
|
|
395
|
+
Returns:
|
|
396
|
+
True if successful
|
|
397
|
+
"""
|
|
398
|
+
import json
|
|
399
|
+
from datetime import datetime
|
|
400
|
+
|
|
401
|
+
if not args:
|
|
402
|
+
# Default filename with timestamp
|
|
403
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
404
|
+
output_file = os.path.join(self.workspace, f"knowledge_export_{timestamp}.json")
|
|
405
|
+
else:
|
|
406
|
+
output_file = args[0]
|
|
407
|
+
if not os.path.isabs(output_file):
|
|
408
|
+
output_file = os.path.join(self.workspace, output_file)
|
|
409
|
+
|
|
410
|
+
knowledge = self._get_knowledge()
|
|
411
|
+
if not knowledge:
|
|
412
|
+
return False
|
|
413
|
+
|
|
414
|
+
try:
|
|
415
|
+
export_data = {
|
|
416
|
+
"version": "1.0",
|
|
417
|
+
"exported_at": datetime.now().isoformat(),
|
|
418
|
+
"workspace": self.workspace,
|
|
419
|
+
"vector_store": self.vector_store,
|
|
420
|
+
"documents": []
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
# Try to get all documents from knowledge/memory
|
|
424
|
+
if hasattr(knowledge, 'memory') and hasattr(knowledge.memory, 'get_all'):
|
|
425
|
+
all_docs = knowledge.memory.get_all()
|
|
426
|
+
if all_docs:
|
|
427
|
+
for doc in all_docs:
|
|
428
|
+
if isinstance(doc, dict):
|
|
429
|
+
export_data["documents"].append(doc)
|
|
430
|
+
else:
|
|
431
|
+
export_data["documents"].append({
|
|
432
|
+
"content": str(doc),
|
|
433
|
+
"metadata": {}
|
|
434
|
+
})
|
|
435
|
+
elif hasattr(knowledge, 'get_all'):
|
|
436
|
+
all_docs = knowledge.get_all()
|
|
437
|
+
if all_docs:
|
|
438
|
+
for doc in all_docs:
|
|
439
|
+
if isinstance(doc, dict):
|
|
440
|
+
export_data["documents"].append(doc)
|
|
441
|
+
else:
|
|
442
|
+
export_data["documents"].append({
|
|
443
|
+
"content": str(doc),
|
|
444
|
+
"metadata": {}
|
|
445
|
+
})
|
|
446
|
+
|
|
447
|
+
# Ensure output directory exists
|
|
448
|
+
os.makedirs(os.path.dirname(output_file) or ".", exist_ok=True)
|
|
449
|
+
|
|
450
|
+
with open(output_file, 'w', encoding='utf-8') as f:
|
|
451
|
+
json.dump(export_data, f, indent=2, default=str)
|
|
452
|
+
|
|
453
|
+
doc_count = len(export_data["documents"])
|
|
454
|
+
self.print_status(f"✅ Exported {doc_count} documents to {output_file}", "success")
|
|
455
|
+
return True
|
|
456
|
+
|
|
457
|
+
except Exception as e:
|
|
458
|
+
self.print_status(f"Export failed: {e}", "error")
|
|
459
|
+
return False
|
|
460
|
+
|
|
461
|
+
def action_import(self, args: List[str], **kwargs) -> bool:
|
|
462
|
+
"""
|
|
463
|
+
Import knowledge base from JSON file.
|
|
464
|
+
|
|
465
|
+
Imports documents from a previously exported JSON file.
|
|
466
|
+
|
|
467
|
+
Args:
|
|
468
|
+
args: List containing input file path
|
|
469
|
+
|
|
470
|
+
Returns:
|
|
471
|
+
True if successful
|
|
472
|
+
"""
|
|
473
|
+
import json
|
|
474
|
+
|
|
475
|
+
if not args:
|
|
476
|
+
self.print_status("Usage: praisonai knowledge import <file.json>", "error")
|
|
477
|
+
return False
|
|
478
|
+
|
|
479
|
+
input_file = args[0]
|
|
480
|
+
if not os.path.isabs(input_file):
|
|
481
|
+
input_file = os.path.join(self.workspace, input_file)
|
|
482
|
+
|
|
483
|
+
if not os.path.exists(input_file):
|
|
484
|
+
self.print_status(f"File not found: {input_file}", "error")
|
|
485
|
+
return False
|
|
486
|
+
|
|
487
|
+
knowledge = self._get_knowledge()
|
|
488
|
+
if not knowledge:
|
|
489
|
+
return False
|
|
490
|
+
|
|
491
|
+
try:
|
|
492
|
+
with open(input_file, 'r', encoding='utf-8') as f:
|
|
493
|
+
import_data = json.load(f)
|
|
494
|
+
|
|
495
|
+
# version field reserved for future schema migrations
|
|
496
|
+
_ = import_data.get("version", "unknown")
|
|
497
|
+
documents = import_data.get("documents", [])
|
|
498
|
+
|
|
499
|
+
if not documents:
|
|
500
|
+
self.print_status("No documents found in import file", "warning")
|
|
501
|
+
return True
|
|
502
|
+
|
|
503
|
+
imported_count = 0
|
|
504
|
+
for doc in documents:
|
|
505
|
+
try:
|
|
506
|
+
content = doc.get("content") or doc.get("memory") or doc.get("text", "")
|
|
507
|
+
metadata = doc.get("metadata", {})
|
|
508
|
+
|
|
509
|
+
if content:
|
|
510
|
+
if hasattr(knowledge, 'store'):
|
|
511
|
+
knowledge.store(content, metadata=metadata)
|
|
512
|
+
elif hasattr(knowledge, 'add'):
|
|
513
|
+
knowledge.add(content, metadata=metadata)
|
|
514
|
+
imported_count += 1
|
|
515
|
+
except Exception as e:
|
|
516
|
+
if self.verbose:
|
|
517
|
+
self.print_status(f"Skipped document: {e}", "warning")
|
|
518
|
+
|
|
519
|
+
self.print_status(f"✅ Imported {imported_count} documents from {input_file}", "success")
|
|
520
|
+
return True
|
|
521
|
+
|
|
522
|
+
except json.JSONDecodeError as e:
|
|
523
|
+
self.print_status(f"Invalid JSON file: {e}", "error")
|
|
524
|
+
return False
|
|
525
|
+
except Exception as e:
|
|
526
|
+
self.print_status(f"Import failed: {e}", "error")
|
|
527
|
+
return False
|
|
528
|
+
|
|
529
|
+
def execute(self, action: str, action_args: List[str], **kwargs) -> Any:
|
|
530
|
+
"""Execute knowledge command action."""
|
|
531
|
+
return super().execute(action, action_args, **kwargs)
|