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,256 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tools Doctor for PraisonAI.
|
|
3
|
+
|
|
4
|
+
Diagnoses tool availability, checks dependencies, and reports issues.
|
|
5
|
+
Supports both human-readable and JSON output formats.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import importlib.util
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any, Dict, List, Optional
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ToolsDoctor:
|
|
16
|
+
"""
|
|
17
|
+
Diagnoses tool availability and dependencies.
|
|
18
|
+
|
|
19
|
+
Checks:
|
|
20
|
+
- praisonai-tools installation
|
|
21
|
+
- Built-in tools availability
|
|
22
|
+
- Custom tool directories
|
|
23
|
+
- Optional dependency packages
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
# Default custom tool directories
|
|
27
|
+
DEFAULT_TOOL_DIRS = [
|
|
28
|
+
"~/.praison/tools",
|
|
29
|
+
"~/.config/praison/tools",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
# Known tools and their optional dependencies
|
|
33
|
+
TOOL_DEPENDENCIES = {
|
|
34
|
+
"youtube_tool": ["pytube", "youtube-transcript-api"],
|
|
35
|
+
"whisper_tool": ["openai-whisper", "torch"],
|
|
36
|
+
"vision_tool": ["pillow", "opencv-python"],
|
|
37
|
+
"tavily_search": ["tavily-python"],
|
|
38
|
+
"arxiv_search": ["arxiv"],
|
|
39
|
+
"wikipedia_search": ["wikipedia"],
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
def __init__(self, custom_dirs: Optional[List[str]] = None):
|
|
43
|
+
"""
|
|
44
|
+
Initialize tools doctor.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
custom_dirs: Additional custom tool directories to check
|
|
48
|
+
"""
|
|
49
|
+
self._custom_dirs = custom_dirs or []
|
|
50
|
+
|
|
51
|
+
def diagnose(self) -> Dict[str, Any]:
|
|
52
|
+
"""
|
|
53
|
+
Run full diagnostics.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
Dict with diagnostic results
|
|
57
|
+
"""
|
|
58
|
+
result = {
|
|
59
|
+
"praisonai_tools_installed": self._check_praisonai_tools(),
|
|
60
|
+
"praisonaiagents_installed": self._check_praisonaiagents(),
|
|
61
|
+
"builtin_tools": self._get_builtin_tools(),
|
|
62
|
+
"praisonai_tools_available": self._get_praisonai_tools_list(),
|
|
63
|
+
"custom_tools_dirs": self._check_custom_dirs(),
|
|
64
|
+
"tool_dependencies": self._check_tool_dependencies(),
|
|
65
|
+
"issues": [],
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# Collect issues
|
|
69
|
+
if not result["praisonaiagents_installed"]:
|
|
70
|
+
result["issues"].append({
|
|
71
|
+
"severity": "error",
|
|
72
|
+
"message": "praisonaiagents not installed",
|
|
73
|
+
"hint": "pip install praisonaiagents"
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
if not result["praisonai_tools_installed"]:
|
|
77
|
+
result["issues"].append({
|
|
78
|
+
"severity": "warning",
|
|
79
|
+
"message": "praisonai-tools not installed (optional)",
|
|
80
|
+
"hint": "pip install praisonai-tools"
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
# Check for missing dependencies
|
|
84
|
+
for tool, deps in result["tool_dependencies"].items():
|
|
85
|
+
missing = [d for d in deps if not d["available"]]
|
|
86
|
+
if missing:
|
|
87
|
+
result["issues"].append({
|
|
88
|
+
"severity": "info",
|
|
89
|
+
"message": f"Tool '{tool}' has missing optional dependencies",
|
|
90
|
+
"hint": f"pip install {' '.join(d['name'] for d in missing)}"
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
return result
|
|
94
|
+
|
|
95
|
+
def _check_praisonai_tools(self) -> bool:
|
|
96
|
+
"""Check if praisonai-tools is installed."""
|
|
97
|
+
spec = importlib.util.find_spec("praisonai_tools")
|
|
98
|
+
return spec is not None
|
|
99
|
+
|
|
100
|
+
def _check_praisonaiagents(self) -> bool:
|
|
101
|
+
"""Check if praisonaiagents is installed."""
|
|
102
|
+
spec = importlib.util.find_spec("praisonaiagents")
|
|
103
|
+
return spec is not None
|
|
104
|
+
|
|
105
|
+
def _get_builtin_tools(self) -> List[str]:
|
|
106
|
+
"""Get list of built-in tools."""
|
|
107
|
+
tools = []
|
|
108
|
+
try:
|
|
109
|
+
from praisonaiagents.tools import TOOL_MAPPINGS
|
|
110
|
+
tools = list(TOOL_MAPPINGS.keys())
|
|
111
|
+
except ImportError:
|
|
112
|
+
pass
|
|
113
|
+
return tools
|
|
114
|
+
|
|
115
|
+
def _get_praisonai_tools_list(self) -> List[str]:
|
|
116
|
+
"""Get list of tools from praisonai-tools package."""
|
|
117
|
+
tools = []
|
|
118
|
+
try:
|
|
119
|
+
import praisonai_tools
|
|
120
|
+
# Get all callable attributes that look like tools
|
|
121
|
+
for name in dir(praisonai_tools):
|
|
122
|
+
if not name.startswith("_"):
|
|
123
|
+
obj = getattr(praisonai_tools, name, None)
|
|
124
|
+
if callable(obj):
|
|
125
|
+
tools.append(name)
|
|
126
|
+
except ImportError:
|
|
127
|
+
pass
|
|
128
|
+
return tools
|
|
129
|
+
|
|
130
|
+
def _check_custom_dirs(self) -> List[Dict[str, Any]]:
|
|
131
|
+
"""Check custom tool directories."""
|
|
132
|
+
dirs = []
|
|
133
|
+
|
|
134
|
+
# Check default dirs
|
|
135
|
+
for dir_path in self.DEFAULT_TOOL_DIRS:
|
|
136
|
+
path = Path(dir_path).expanduser()
|
|
137
|
+
tool_count = 0
|
|
138
|
+
if path.exists():
|
|
139
|
+
# Count Python files
|
|
140
|
+
tool_count = len(list(path.glob("*.py")))
|
|
141
|
+
|
|
142
|
+
dirs.append({
|
|
143
|
+
"path": str(path),
|
|
144
|
+
"exists": path.exists(),
|
|
145
|
+
"tool_count": tool_count
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
# Check custom dirs
|
|
149
|
+
for dir_path in self._custom_dirs:
|
|
150
|
+
path = Path(dir_path).expanduser()
|
|
151
|
+
tool_count = 0
|
|
152
|
+
if path.exists():
|
|
153
|
+
tool_count = len(list(path.glob("*.py")))
|
|
154
|
+
|
|
155
|
+
dirs.append({
|
|
156
|
+
"path": str(path),
|
|
157
|
+
"exists": path.exists(),
|
|
158
|
+
"tool_count": tool_count,
|
|
159
|
+
"custom": True
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
return dirs
|
|
163
|
+
|
|
164
|
+
def _check_tool_dependencies(self) -> Dict[str, List[Dict[str, Any]]]:
|
|
165
|
+
"""Check dependencies for known tools."""
|
|
166
|
+
result = {}
|
|
167
|
+
|
|
168
|
+
for tool, deps in self.TOOL_DEPENDENCIES.items():
|
|
169
|
+
result[tool] = []
|
|
170
|
+
for dep in deps:
|
|
171
|
+
spec = importlib.util.find_spec(dep.replace("-", "_"))
|
|
172
|
+
result[tool].append({
|
|
173
|
+
"name": dep,
|
|
174
|
+
"available": spec is not None
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
return result
|
|
178
|
+
|
|
179
|
+
def diagnose_json(self) -> str:
|
|
180
|
+
"""
|
|
181
|
+
Run diagnostics and return JSON output.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
JSON string with diagnostic results
|
|
185
|
+
"""
|
|
186
|
+
result = self.diagnose()
|
|
187
|
+
return json.dumps(result, indent=2)
|
|
188
|
+
|
|
189
|
+
def diagnose_human(self) -> str:
|
|
190
|
+
"""
|
|
191
|
+
Run diagnostics and return human-readable output.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
Formatted string with diagnostic results
|
|
195
|
+
"""
|
|
196
|
+
result = self.diagnose()
|
|
197
|
+
lines = []
|
|
198
|
+
|
|
199
|
+
lines.append("=" * 60)
|
|
200
|
+
lines.append("PraisonAI Tools Doctor")
|
|
201
|
+
lines.append("=" * 60)
|
|
202
|
+
lines.append("")
|
|
203
|
+
|
|
204
|
+
# Core packages
|
|
205
|
+
lines.append("Core Packages:")
|
|
206
|
+
status = "✓" if result["praisonaiagents_installed"] else "✗"
|
|
207
|
+
lines.append(f" {status} praisonaiagents")
|
|
208
|
+
status = "✓" if result["praisonai_tools_installed"] else "✗"
|
|
209
|
+
lines.append(f" {status} praisonai-tools (optional)")
|
|
210
|
+
lines.append("")
|
|
211
|
+
|
|
212
|
+
# Built-in tools
|
|
213
|
+
lines.append(f"Built-in Tools ({len(result['builtin_tools'])}):")
|
|
214
|
+
if result["builtin_tools"]:
|
|
215
|
+
for tool in result["builtin_tools"][:10]:
|
|
216
|
+
lines.append(f" • {tool}")
|
|
217
|
+
if len(result["builtin_tools"]) > 10:
|
|
218
|
+
lines.append(f" ... and {len(result['builtin_tools']) - 10} more")
|
|
219
|
+
else:
|
|
220
|
+
lines.append(" (none found)")
|
|
221
|
+
lines.append("")
|
|
222
|
+
|
|
223
|
+
# praisonai-tools
|
|
224
|
+
if result["praisonai_tools_available"]:
|
|
225
|
+
lines.append(f"praisonai-tools ({len(result['praisonai_tools_available'])}):")
|
|
226
|
+
for tool in result["praisonai_tools_available"][:10]:
|
|
227
|
+
lines.append(f" • {tool}")
|
|
228
|
+
if len(result["praisonai_tools_available"]) > 10:
|
|
229
|
+
lines.append(f" ... and {len(result['praisonai_tools_available']) - 10} more")
|
|
230
|
+
lines.append("")
|
|
231
|
+
|
|
232
|
+
# Custom directories
|
|
233
|
+
lines.append("Custom Tool Directories:")
|
|
234
|
+
for dir_info in result["custom_tools_dirs"]:
|
|
235
|
+
status = "✓" if dir_info["exists"] else "✗"
|
|
236
|
+
count = f" ({dir_info['tool_count']} tools)" if dir_info["exists"] else ""
|
|
237
|
+
custom = " [custom]" if dir_info.get("custom") else ""
|
|
238
|
+
lines.append(f" {status} {dir_info['path']}{count}{custom}")
|
|
239
|
+
lines.append("")
|
|
240
|
+
|
|
241
|
+
# Issues
|
|
242
|
+
if result["issues"]:
|
|
243
|
+
lines.append("Issues Found:")
|
|
244
|
+
for issue in result["issues"]:
|
|
245
|
+
icon = {"error": "❌", "warning": "⚠️", "info": "ℹ️"}.get(issue["severity"], "•")
|
|
246
|
+
lines.append(f" {icon} {issue['message']}")
|
|
247
|
+
if issue.get("hint"):
|
|
248
|
+
lines.append(f" Hint: {issue['hint']}")
|
|
249
|
+
lines.append("")
|
|
250
|
+
else:
|
|
251
|
+
lines.append("✓ No issues found")
|
|
252
|
+
lines.append("")
|
|
253
|
+
|
|
254
|
+
lines.append("=" * 60)
|
|
255
|
+
|
|
256
|
+
return "\n".join(lines)
|
praisonai/test.py
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import yaml
|
|
2
|
+
import os
|
|
3
|
+
from rich import print
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
from crewai import Agent, Task, Crew
|
|
6
|
+
load_dotenv()
|
|
7
|
+
import autogen
|
|
8
|
+
config_list = [
|
|
9
|
+
{
|
|
10
|
+
'model': os.environ.get("OPENAI_MODEL_NAME", "gpt-5-nano"),
|
|
11
|
+
'base_url': os.environ.get("OPENAI_API_BASE", "https://api.openai.com/v1"),
|
|
12
|
+
'api_key': os.environ.get("OPENAI_API_KEY")
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
def generate_crew_and_kickoff(agent_file):
|
|
17
|
+
"""
|
|
18
|
+
This function generates a crew of agents and kicks off tasks based on the configuration provided in a YAML file.
|
|
19
|
+
|
|
20
|
+
Parameters:
|
|
21
|
+
agent_file (str): The path to the YAML file containing the configuration for the agents and tasks.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
str: The result of the last task executed by the crew.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
with open(agent_file, 'r') as f:
|
|
28
|
+
config = yaml.safe_load(f)
|
|
29
|
+
|
|
30
|
+
topic = config['topic']
|
|
31
|
+
framework = config['framework']
|
|
32
|
+
|
|
33
|
+
agents = {}
|
|
34
|
+
tasks = []
|
|
35
|
+
if framework == "autogen":
|
|
36
|
+
# Load the LLM configuration dynamically
|
|
37
|
+
print(config_list)
|
|
38
|
+
llm_config = {"config_list": config_list}
|
|
39
|
+
|
|
40
|
+
for role, details in config['roles'].items():
|
|
41
|
+
agent_name = details['role'].format(topic=topic).replace("{topic}", topic)
|
|
42
|
+
agent_goal = details['goal'].format(topic=topic)
|
|
43
|
+
# Creating an AssistantAgent for each role dynamically
|
|
44
|
+
agents[role] = autogen.AssistantAgent(
|
|
45
|
+
name=agent_name,
|
|
46
|
+
llm_config=llm_config,
|
|
47
|
+
system_message=details['backstory'].format(topic=topic)+". Reply \"TERMINATE\" in the end when everything is done.",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# Preparing tasks for initiate_chats
|
|
51
|
+
for task_name, task_details in details.get('tasks', {}).items():
|
|
52
|
+
description_filled = task_details['description'].format(topic=topic)
|
|
53
|
+
expected_output_filled = task_details['expected_output'].format(topic=topic)
|
|
54
|
+
|
|
55
|
+
chat_task = {
|
|
56
|
+
"recipient": agents[role],
|
|
57
|
+
"message": description_filled,
|
|
58
|
+
"summary_method": "last_msg", # Customize as needed
|
|
59
|
+
# Additional fields like carryover can be added based on dependencies
|
|
60
|
+
}
|
|
61
|
+
tasks.append(chat_task)
|
|
62
|
+
|
|
63
|
+
# Assuming the user proxy agent is set up as per your requirements
|
|
64
|
+
user = autogen.UserProxyAgent(
|
|
65
|
+
name="User",
|
|
66
|
+
human_input_mode="NEVER",
|
|
67
|
+
is_termination_msg=lambda x: (x.get("content") or "").rstrip().endswith("TERMINATE"),
|
|
68
|
+
code_execution_config={
|
|
69
|
+
"work_dir": "coding",
|
|
70
|
+
"use_docker": False,
|
|
71
|
+
},
|
|
72
|
+
# additional setup for the user proxy agent
|
|
73
|
+
)
|
|
74
|
+
response = user.initiate_chats(tasks)
|
|
75
|
+
result = "### Output ###\n"+response[-1].summary if hasattr(response[-1], 'summary') else ""
|
|
76
|
+
else:
|
|
77
|
+
for role, details in config['roles'].items():
|
|
78
|
+
role_filled = details['role'].format(topic=topic)
|
|
79
|
+
goal_filled = details['goal'].format(topic=topic)
|
|
80
|
+
backstory_filled = details['backstory'].format(topic=topic)
|
|
81
|
+
|
|
82
|
+
# Assume tools are loaded and handled here as per your requirements
|
|
83
|
+
agent = Agent(role=role_filled, goal=goal_filled, backstory=backstory_filled)
|
|
84
|
+
agents[role] = agent
|
|
85
|
+
|
|
86
|
+
for task_name, task_details in details.get('tasks', {}).items():
|
|
87
|
+
description_filled = task_details['description'].format(topic=topic)
|
|
88
|
+
expected_output_filled = task_details['expected_output'].format(topic=topic)
|
|
89
|
+
|
|
90
|
+
task = Task(description=description_filled, expected_output=expected_output_filled, agent=agent)
|
|
91
|
+
tasks.append(task)
|
|
92
|
+
|
|
93
|
+
crew = Crew(
|
|
94
|
+
agents=list(agents.values()),
|
|
95
|
+
tasks=tasks,
|
|
96
|
+
verbose=2
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
result = crew.kickoff()
|
|
100
|
+
return result
|
|
101
|
+
|
|
102
|
+
if __name__ == "__main__":
|
|
103
|
+
agent_file = "agents.yaml"
|
|
104
|
+
result = generate_crew_and_kickoff(agent_file)
|
|
105
|
+
print(result)
|