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,366 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Database checks for the Doctor CLI module.
|
|
3
|
+
|
|
4
|
+
Validates database connectivity and configuration.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
from ..models import (
|
|
10
|
+
CheckCategory,
|
|
11
|
+
CheckResult,
|
|
12
|
+
CheckStatus,
|
|
13
|
+
CheckSeverity,
|
|
14
|
+
DoctorConfig,
|
|
15
|
+
)
|
|
16
|
+
from ..registry import register_check
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _parse_dsn(dsn: str) -> dict:
|
|
20
|
+
"""Parse a database DSN into components."""
|
|
21
|
+
result = {"type": "unknown", "host": "", "port": "", "database": ""}
|
|
22
|
+
|
|
23
|
+
if dsn.startswith("postgresql://") or dsn.startswith("postgres://"):
|
|
24
|
+
result["type"] = "postgresql"
|
|
25
|
+
elif dsn.startswith("sqlite://"):
|
|
26
|
+
result["type"] = "sqlite"
|
|
27
|
+
elif dsn.startswith("redis://"):
|
|
28
|
+
result["type"] = "redis"
|
|
29
|
+
elif dsn.startswith("mongodb://") or dsn.startswith("mongodb+srv://"):
|
|
30
|
+
result["type"] = "mongodb"
|
|
31
|
+
|
|
32
|
+
return result
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@register_check(
|
|
36
|
+
id="db_config",
|
|
37
|
+
title="Database Configuration",
|
|
38
|
+
description="Check database configuration from environment",
|
|
39
|
+
category=CheckCategory.DATABASE,
|
|
40
|
+
severity=CheckSeverity.INFO,
|
|
41
|
+
)
|
|
42
|
+
def check_db_config(config: DoctorConfig) -> CheckResult:
|
|
43
|
+
"""Check database configuration from environment."""
|
|
44
|
+
dsn = config.dsn or os.environ.get("DATABASE_URL") or os.environ.get("PRAISONAI_DATABASE_URL")
|
|
45
|
+
|
|
46
|
+
if dsn:
|
|
47
|
+
parsed = _parse_dsn(dsn)
|
|
48
|
+
return CheckResult(
|
|
49
|
+
id="db_config",
|
|
50
|
+
title="Database Configuration",
|
|
51
|
+
category=CheckCategory.DATABASE,
|
|
52
|
+
status=CheckStatus.PASS,
|
|
53
|
+
message=f"Database configured: {parsed['type']}",
|
|
54
|
+
metadata={"type": parsed["type"]},
|
|
55
|
+
)
|
|
56
|
+
else:
|
|
57
|
+
return CheckResult(
|
|
58
|
+
id="db_config",
|
|
59
|
+
title="Database Configuration",
|
|
60
|
+
category=CheckCategory.DATABASE,
|
|
61
|
+
status=CheckStatus.SKIP,
|
|
62
|
+
message="No database DSN configured (using file-based storage)",
|
|
63
|
+
details="Set DATABASE_URL to enable database persistence",
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@register_check(
|
|
68
|
+
id="db_driver_postgresql",
|
|
69
|
+
title="PostgreSQL Driver",
|
|
70
|
+
description="Check PostgreSQL driver availability",
|
|
71
|
+
category=CheckCategory.DATABASE,
|
|
72
|
+
severity=CheckSeverity.LOW,
|
|
73
|
+
)
|
|
74
|
+
def check_db_driver_postgresql(config: DoctorConfig) -> CheckResult:
|
|
75
|
+
"""Check PostgreSQL driver availability."""
|
|
76
|
+
try:
|
|
77
|
+
import psycopg2
|
|
78
|
+
version = getattr(psycopg2, "__version__", "unknown")
|
|
79
|
+
return CheckResult(
|
|
80
|
+
id="db_driver_postgresql",
|
|
81
|
+
title="PostgreSQL Driver",
|
|
82
|
+
category=CheckCategory.DATABASE,
|
|
83
|
+
status=CheckStatus.PASS,
|
|
84
|
+
message=f"psycopg2 {version} available",
|
|
85
|
+
)
|
|
86
|
+
except ImportError:
|
|
87
|
+
try:
|
|
88
|
+
import asyncpg
|
|
89
|
+
version = getattr(asyncpg, "__version__", "unknown")
|
|
90
|
+
return CheckResult(
|
|
91
|
+
id="db_driver_postgresql",
|
|
92
|
+
title="PostgreSQL Driver",
|
|
93
|
+
category=CheckCategory.DATABASE,
|
|
94
|
+
status=CheckStatus.PASS,
|
|
95
|
+
message=f"asyncpg {version} available",
|
|
96
|
+
)
|
|
97
|
+
except ImportError:
|
|
98
|
+
return CheckResult(
|
|
99
|
+
id="db_driver_postgresql",
|
|
100
|
+
title="PostgreSQL Driver",
|
|
101
|
+
category=CheckCategory.DATABASE,
|
|
102
|
+
status=CheckStatus.SKIP,
|
|
103
|
+
message="PostgreSQL driver not installed (optional)",
|
|
104
|
+
remediation="Install with: pip install psycopg2-binary or pip install asyncpg",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@register_check(
|
|
109
|
+
id="db_driver_sqlite",
|
|
110
|
+
title="SQLite Driver",
|
|
111
|
+
description="Check SQLite driver availability",
|
|
112
|
+
category=CheckCategory.DATABASE,
|
|
113
|
+
severity=CheckSeverity.LOW,
|
|
114
|
+
)
|
|
115
|
+
def check_db_driver_sqlite(config: DoctorConfig) -> CheckResult:
|
|
116
|
+
"""Check SQLite driver availability."""
|
|
117
|
+
try:
|
|
118
|
+
import sqlite3
|
|
119
|
+
version = sqlite3.sqlite_version
|
|
120
|
+
return CheckResult(
|
|
121
|
+
id="db_driver_sqlite",
|
|
122
|
+
title="SQLite Driver",
|
|
123
|
+
category=CheckCategory.DATABASE,
|
|
124
|
+
status=CheckStatus.PASS,
|
|
125
|
+
message=f"SQLite {version} available (built-in)",
|
|
126
|
+
)
|
|
127
|
+
except ImportError:
|
|
128
|
+
return CheckResult(
|
|
129
|
+
id="db_driver_sqlite",
|
|
130
|
+
title="SQLite Driver",
|
|
131
|
+
category=CheckCategory.DATABASE,
|
|
132
|
+
status=CheckStatus.FAIL,
|
|
133
|
+
message="SQLite not available",
|
|
134
|
+
severity=CheckSeverity.HIGH,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@register_check(
|
|
139
|
+
id="db_driver_redis",
|
|
140
|
+
title="Redis Driver",
|
|
141
|
+
description="Check Redis driver availability",
|
|
142
|
+
category=CheckCategory.DATABASE,
|
|
143
|
+
severity=CheckSeverity.LOW,
|
|
144
|
+
)
|
|
145
|
+
def check_db_driver_redis(config: DoctorConfig) -> CheckResult:
|
|
146
|
+
"""Check Redis driver availability."""
|
|
147
|
+
try:
|
|
148
|
+
import redis
|
|
149
|
+
version = getattr(redis, "__version__", "unknown")
|
|
150
|
+
return CheckResult(
|
|
151
|
+
id="db_driver_redis",
|
|
152
|
+
title="Redis Driver",
|
|
153
|
+
category=CheckCategory.DATABASE,
|
|
154
|
+
status=CheckStatus.PASS,
|
|
155
|
+
message=f"redis-py {version} available",
|
|
156
|
+
)
|
|
157
|
+
except ImportError:
|
|
158
|
+
return CheckResult(
|
|
159
|
+
id="db_driver_redis",
|
|
160
|
+
title="Redis Driver",
|
|
161
|
+
category=CheckCategory.DATABASE,
|
|
162
|
+
status=CheckStatus.SKIP,
|
|
163
|
+
message="Redis driver not installed (optional)",
|
|
164
|
+
remediation="Install with: pip install redis",
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@register_check(
|
|
169
|
+
id="db_driver_mongodb",
|
|
170
|
+
title="MongoDB Driver",
|
|
171
|
+
description="Check MongoDB driver availability",
|
|
172
|
+
category=CheckCategory.DATABASE,
|
|
173
|
+
severity=CheckSeverity.LOW,
|
|
174
|
+
)
|
|
175
|
+
def check_db_driver_mongodb(config: DoctorConfig) -> CheckResult:
|
|
176
|
+
"""Check MongoDB driver availability."""
|
|
177
|
+
try:
|
|
178
|
+
import pymongo
|
|
179
|
+
version = getattr(pymongo, "__version__", "unknown")
|
|
180
|
+
return CheckResult(
|
|
181
|
+
id="db_driver_mongodb",
|
|
182
|
+
title="MongoDB Driver",
|
|
183
|
+
category=CheckCategory.DATABASE,
|
|
184
|
+
status=CheckStatus.PASS,
|
|
185
|
+
message=f"pymongo {version} available",
|
|
186
|
+
)
|
|
187
|
+
except ImportError:
|
|
188
|
+
return CheckResult(
|
|
189
|
+
id="db_driver_mongodb",
|
|
190
|
+
title="MongoDB Driver",
|
|
191
|
+
category=CheckCategory.DATABASE,
|
|
192
|
+
status=CheckStatus.SKIP,
|
|
193
|
+
message="MongoDB driver not installed (optional)",
|
|
194
|
+
remediation="Install with: pip install pymongo",
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
@register_check(
|
|
199
|
+
id="db_connectivity",
|
|
200
|
+
title="Database Connectivity",
|
|
201
|
+
description="Test database connection",
|
|
202
|
+
category=CheckCategory.DATABASE,
|
|
203
|
+
severity=CheckSeverity.MEDIUM,
|
|
204
|
+
requires_deep=True,
|
|
205
|
+
)
|
|
206
|
+
def check_db_connectivity(config: DoctorConfig) -> CheckResult:
|
|
207
|
+
"""Test database connection."""
|
|
208
|
+
dsn = config.dsn or os.environ.get("DATABASE_URL") or os.environ.get("PRAISONAI_DATABASE_URL")
|
|
209
|
+
|
|
210
|
+
if not dsn:
|
|
211
|
+
return CheckResult(
|
|
212
|
+
id="db_connectivity",
|
|
213
|
+
title="Database Connectivity",
|
|
214
|
+
category=CheckCategory.DATABASE,
|
|
215
|
+
status=CheckStatus.SKIP,
|
|
216
|
+
message="No database DSN configured",
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
parsed = _parse_dsn(dsn)
|
|
220
|
+
|
|
221
|
+
try:
|
|
222
|
+
if parsed["type"] == "postgresql":
|
|
223
|
+
try:
|
|
224
|
+
import psycopg2
|
|
225
|
+
conn = psycopg2.connect(dsn, connect_timeout=5)
|
|
226
|
+
cursor = conn.cursor()
|
|
227
|
+
cursor.execute("SELECT 1")
|
|
228
|
+
cursor.close()
|
|
229
|
+
conn.close()
|
|
230
|
+
return CheckResult(
|
|
231
|
+
id="db_connectivity",
|
|
232
|
+
title="Database Connectivity",
|
|
233
|
+
category=CheckCategory.DATABASE,
|
|
234
|
+
status=CheckStatus.PASS,
|
|
235
|
+
message="PostgreSQL connection successful",
|
|
236
|
+
)
|
|
237
|
+
except ImportError:
|
|
238
|
+
return CheckResult(
|
|
239
|
+
id="db_connectivity",
|
|
240
|
+
title="Database Connectivity",
|
|
241
|
+
category=CheckCategory.DATABASE,
|
|
242
|
+
status=CheckStatus.SKIP,
|
|
243
|
+
message="PostgreSQL driver not installed",
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
elif parsed["type"] == "sqlite":
|
|
247
|
+
import sqlite3
|
|
248
|
+
# Extract path from DSN
|
|
249
|
+
db_path = dsn.replace("sqlite:///", "").replace("sqlite://", "")
|
|
250
|
+
if db_path == ":memory:" or os.path.exists(db_path) or db_path == "":
|
|
251
|
+
conn = sqlite3.connect(db_path if db_path else ":memory:")
|
|
252
|
+
cursor = conn.cursor()
|
|
253
|
+
cursor.execute("SELECT 1")
|
|
254
|
+
cursor.close()
|
|
255
|
+
conn.close()
|
|
256
|
+
return CheckResult(
|
|
257
|
+
id="db_connectivity",
|
|
258
|
+
title="Database Connectivity",
|
|
259
|
+
category=CheckCategory.DATABASE,
|
|
260
|
+
status=CheckStatus.PASS,
|
|
261
|
+
message="SQLite connection successful",
|
|
262
|
+
)
|
|
263
|
+
else:
|
|
264
|
+
return CheckResult(
|
|
265
|
+
id="db_connectivity",
|
|
266
|
+
title="Database Connectivity",
|
|
267
|
+
category=CheckCategory.DATABASE,
|
|
268
|
+
status=CheckStatus.WARN,
|
|
269
|
+
message=f"SQLite database file not found: {db_path}",
|
|
270
|
+
details="File will be created on first use",
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
elif parsed["type"] == "redis":
|
|
274
|
+
try:
|
|
275
|
+
import redis
|
|
276
|
+
client = redis.from_url(dsn, socket_timeout=5)
|
|
277
|
+
client.ping()
|
|
278
|
+
client.close()
|
|
279
|
+
return CheckResult(
|
|
280
|
+
id="db_connectivity",
|
|
281
|
+
title="Database Connectivity",
|
|
282
|
+
category=CheckCategory.DATABASE,
|
|
283
|
+
status=CheckStatus.PASS,
|
|
284
|
+
message="Redis connection successful",
|
|
285
|
+
)
|
|
286
|
+
except ImportError:
|
|
287
|
+
return CheckResult(
|
|
288
|
+
id="db_connectivity",
|
|
289
|
+
title="Database Connectivity",
|
|
290
|
+
category=CheckCategory.DATABASE,
|
|
291
|
+
status=CheckStatus.SKIP,
|
|
292
|
+
message="Redis driver not installed",
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
elif parsed["type"] == "mongodb":
|
|
296
|
+
try:
|
|
297
|
+
import pymongo
|
|
298
|
+
client = pymongo.MongoClient(dsn, serverSelectionTimeoutMS=5000)
|
|
299
|
+
client.admin.command("ping")
|
|
300
|
+
client.close()
|
|
301
|
+
return CheckResult(
|
|
302
|
+
id="db_connectivity",
|
|
303
|
+
title="Database Connectivity",
|
|
304
|
+
category=CheckCategory.DATABASE,
|
|
305
|
+
status=CheckStatus.PASS,
|
|
306
|
+
message="MongoDB connection successful",
|
|
307
|
+
)
|
|
308
|
+
except ImportError:
|
|
309
|
+
return CheckResult(
|
|
310
|
+
id="db_connectivity",
|
|
311
|
+
title="Database Connectivity",
|
|
312
|
+
category=CheckCategory.DATABASE,
|
|
313
|
+
status=CheckStatus.SKIP,
|
|
314
|
+
message="MongoDB driver not installed",
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
else:
|
|
318
|
+
return CheckResult(
|
|
319
|
+
id="db_connectivity",
|
|
320
|
+
title="Database Connectivity",
|
|
321
|
+
category=CheckCategory.DATABASE,
|
|
322
|
+
status=CheckStatus.SKIP,
|
|
323
|
+
message=f"Unknown database type: {parsed['type']}",
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
except Exception as e:
|
|
327
|
+
return CheckResult(
|
|
328
|
+
id="db_connectivity",
|
|
329
|
+
title="Database Connectivity",
|
|
330
|
+
category=CheckCategory.DATABASE,
|
|
331
|
+
status=CheckStatus.FAIL,
|
|
332
|
+
message=f"Connection failed: {type(e).__name__}",
|
|
333
|
+
details=str(e)[:200],
|
|
334
|
+
remediation="Check database server is running and DSN is correct",
|
|
335
|
+
severity=CheckSeverity.HIGH,
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
@register_check(
|
|
340
|
+
id="db_chromadb",
|
|
341
|
+
title="ChromaDB (Vector Store)",
|
|
342
|
+
description="Check ChromaDB availability for RAG",
|
|
343
|
+
category=CheckCategory.DATABASE,
|
|
344
|
+
severity=CheckSeverity.LOW,
|
|
345
|
+
)
|
|
346
|
+
def check_db_chromadb(config: DoctorConfig) -> CheckResult:
|
|
347
|
+
"""Check ChromaDB availability for RAG."""
|
|
348
|
+
try:
|
|
349
|
+
import chromadb
|
|
350
|
+
version = getattr(chromadb, "__version__", "unknown")
|
|
351
|
+
return CheckResult(
|
|
352
|
+
id="db_chromadb",
|
|
353
|
+
title="ChromaDB (Vector Store)",
|
|
354
|
+
category=CheckCategory.DATABASE,
|
|
355
|
+
status=CheckStatus.PASS,
|
|
356
|
+
message=f"ChromaDB {version} available",
|
|
357
|
+
)
|
|
358
|
+
except ImportError:
|
|
359
|
+
return CheckResult(
|
|
360
|
+
id="db_chromadb",
|
|
361
|
+
title="ChromaDB (Vector Store)",
|
|
362
|
+
category=CheckCategory.DATABASE,
|
|
363
|
+
status=CheckStatus.SKIP,
|
|
364
|
+
message="ChromaDB not installed (required for Knowledge/RAG features)",
|
|
365
|
+
remediation="Install with: pip install chromadb",
|
|
366
|
+
)
|