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,375 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Multi-Agent CLI Feature Handler
|
|
3
|
+
|
|
4
|
+
Provides CLI commands for defining and running multiple agents:
|
|
5
|
+
- praisonai agents run --agent "name:role:tools" --agent "..." --task "..."
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
praisonai agents run \
|
|
9
|
+
--agent "researcher:Research Analyst:internet_search" \
|
|
10
|
+
--agent "writer:Content Writer:write_file" \
|
|
11
|
+
--task "Research AI trends and write a report"
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Optional, List, Dict, Any
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def parse_agent_definition(definition: str) -> Dict[str, Any]:
|
|
20
|
+
"""Parse an agent definition string.
|
|
21
|
+
|
|
22
|
+
Format: name:role:tools:goal (tools and goal are optional)
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
definition: Agent definition string
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Dictionary with name, role, tools, and optionally goal
|
|
29
|
+
"""
|
|
30
|
+
parts = definition.split(':')
|
|
31
|
+
|
|
32
|
+
result = {
|
|
33
|
+
'name': parts[0].strip() if len(parts) > 0 else 'agent',
|
|
34
|
+
'role': parts[1].strip() if len(parts) > 1 else 'Assistant',
|
|
35
|
+
'tools': [],
|
|
36
|
+
'goal': None
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# Parse tools (comma-separated)
|
|
40
|
+
if len(parts) > 2 and parts[2].strip():
|
|
41
|
+
result['tools'] = [t.strip() for t in parts[2].split(',') if t.strip()]
|
|
42
|
+
|
|
43
|
+
# Parse goal if provided
|
|
44
|
+
if len(parts) > 3:
|
|
45
|
+
result['goal'] = parts[3].strip()
|
|
46
|
+
|
|
47
|
+
return result
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class MultiAgentHandler:
|
|
51
|
+
"""Handler for multi-agent CLI commands."""
|
|
52
|
+
|
|
53
|
+
def __init__(self, verbose: bool = True):
|
|
54
|
+
"""Initialize the multi-agent handler.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
verbose: Whether to print verbose output
|
|
58
|
+
"""
|
|
59
|
+
self.verbose = verbose
|
|
60
|
+
|
|
61
|
+
def create_agents_from_definitions(
|
|
62
|
+
self,
|
|
63
|
+
definitions: List[str],
|
|
64
|
+
llm: Optional[str] = None,
|
|
65
|
+
instructions: Optional[str] = None
|
|
66
|
+
) -> List[Dict[str, Any]]:
|
|
67
|
+
"""Create agent configurations from definition strings.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
definitions: List of agent definition strings
|
|
71
|
+
llm: LLM model to use for all agents
|
|
72
|
+
instructions: Additional instructions for all agents
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
List of agent configuration dictionaries
|
|
76
|
+
"""
|
|
77
|
+
agents = []
|
|
78
|
+
|
|
79
|
+
for definition in definitions:
|
|
80
|
+
agent_config = parse_agent_definition(definition)
|
|
81
|
+
|
|
82
|
+
if llm:
|
|
83
|
+
agent_config['llm'] = llm
|
|
84
|
+
|
|
85
|
+
if instructions:
|
|
86
|
+
agent_config['instructions'] = instructions
|
|
87
|
+
|
|
88
|
+
agents.append(agent_config)
|
|
89
|
+
|
|
90
|
+
return agents
|
|
91
|
+
|
|
92
|
+
def prepare_execution_config(
|
|
93
|
+
self,
|
|
94
|
+
agent_definitions: List[str],
|
|
95
|
+
task: str,
|
|
96
|
+
process: str = "sequential",
|
|
97
|
+
llm: Optional[str] = None,
|
|
98
|
+
instructions: Optional[str] = None
|
|
99
|
+
) -> Dict[str, Any]:
|
|
100
|
+
"""Prepare configuration for agent execution.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
agent_definitions: List of agent definition strings
|
|
104
|
+
task: Task description
|
|
105
|
+
process: Execution process (sequential, parallel)
|
|
106
|
+
llm: LLM model to use
|
|
107
|
+
instructions: Additional instructions
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
Execution configuration dictionary
|
|
111
|
+
"""
|
|
112
|
+
agents = self.create_agents_from_definitions(
|
|
113
|
+
agent_definitions, llm, instructions
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
'agents': agents,
|
|
118
|
+
'task': task,
|
|
119
|
+
'process': process,
|
|
120
|
+
'llm': llm
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
def _load_tools(self, tool_names: List[str]) -> List:
|
|
124
|
+
"""Load tool functions by name.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
tool_names: List of tool names to load
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
List of tool functions
|
|
131
|
+
"""
|
|
132
|
+
tools = []
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
from praisonaiagents.tools import (
|
|
136
|
+
internet_search, read_file, write_file, list_files,
|
|
137
|
+
execute_command, read_csv, write_csv, analyze_csv
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
tool_map = {
|
|
141
|
+
'internet_search': internet_search,
|
|
142
|
+
'read_file': read_file,
|
|
143
|
+
'write_file': write_file,
|
|
144
|
+
'list_files': list_files,
|
|
145
|
+
'execute_command': execute_command,
|
|
146
|
+
'read_csv': read_csv,
|
|
147
|
+
'write_csv': write_csv,
|
|
148
|
+
'analyze_csv': analyze_csv,
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
for name in tool_names:
|
|
152
|
+
if name in tool_map:
|
|
153
|
+
tools.append(tool_map[name])
|
|
154
|
+
else:
|
|
155
|
+
if self.verbose:
|
|
156
|
+
print(f"⚠ Tool '{name}' not found, skipping")
|
|
157
|
+
except ImportError as e:
|
|
158
|
+
if self.verbose:
|
|
159
|
+
print(f"⚠ Could not load tools: {e}")
|
|
160
|
+
|
|
161
|
+
return tools
|
|
162
|
+
|
|
163
|
+
def _execute_agents(
|
|
164
|
+
self,
|
|
165
|
+
agents_config: List[Dict[str, Any]],
|
|
166
|
+
task: str,
|
|
167
|
+
process: str = "sequential",
|
|
168
|
+
llm: Optional[str] = None
|
|
169
|
+
) -> str:
|
|
170
|
+
"""Execute agents with the given configuration.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
agents_config: List of agent configurations
|
|
174
|
+
task: Task to execute
|
|
175
|
+
process: Execution process
|
|
176
|
+
llm: LLM model to use
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Execution result
|
|
180
|
+
"""
|
|
181
|
+
try:
|
|
182
|
+
from praisonaiagents import Agent, Task, PraisonAIAgents
|
|
183
|
+
|
|
184
|
+
# Create Agent objects
|
|
185
|
+
agents = []
|
|
186
|
+
tasks = []
|
|
187
|
+
|
|
188
|
+
for i, config in enumerate(agents_config):
|
|
189
|
+
# Load tools for this agent
|
|
190
|
+
tools = self._load_tools(config.get('tools', []))
|
|
191
|
+
|
|
192
|
+
agent = Agent(
|
|
193
|
+
name=config['name'],
|
|
194
|
+
role=config['role'],
|
|
195
|
+
goal=config.get('goal') or f"Complete tasks as {config['role']}",
|
|
196
|
+
backstory=f"You are a skilled {config['role']}.",
|
|
197
|
+
instructions=config.get('instructions', ''),
|
|
198
|
+
tools=tools if tools else None,
|
|
199
|
+
llm=config.get('llm') or llm or os.environ.get('OPENAI_MODEL_NAME', 'gpt-4o-mini'),
|
|
200
|
+
verbose=self.verbose
|
|
201
|
+
)
|
|
202
|
+
agents.append(agent)
|
|
203
|
+
|
|
204
|
+
# Create task for this agent
|
|
205
|
+
agent_task = Task(
|
|
206
|
+
name=f"task_{config['name']}",
|
|
207
|
+
description=task if i == 0 else f"Continue the work: {task}",
|
|
208
|
+
expected_output="Completed task output",
|
|
209
|
+
agent=agent
|
|
210
|
+
)
|
|
211
|
+
tasks.append(agent_task)
|
|
212
|
+
|
|
213
|
+
# Run agents
|
|
214
|
+
if self.verbose:
|
|
215
|
+
print(f"\n🚀 Running {len(agents)} agents ({process} mode)...")
|
|
216
|
+
for agent in agents:
|
|
217
|
+
print(f" - {agent.name}: {agent.role}")
|
|
218
|
+
print()
|
|
219
|
+
|
|
220
|
+
praison_agents = PraisonAIAgents(
|
|
221
|
+
agents=agents,
|
|
222
|
+
tasks=tasks,
|
|
223
|
+
process=process,
|
|
224
|
+
verbose=self.verbose
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
result = praison_agents.start()
|
|
228
|
+
return result
|
|
229
|
+
|
|
230
|
+
except Exception as e:
|
|
231
|
+
if self.verbose:
|
|
232
|
+
print(f"❌ Execution failed: {e}")
|
|
233
|
+
raise
|
|
234
|
+
|
|
235
|
+
def run(
|
|
236
|
+
self,
|
|
237
|
+
agent_definitions: List[str],
|
|
238
|
+
task: str,
|
|
239
|
+
process: str = "sequential",
|
|
240
|
+
llm: Optional[str] = None,
|
|
241
|
+
instructions: Optional[str] = None
|
|
242
|
+
) -> str:
|
|
243
|
+
"""Run multiple agents with the given task.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
agent_definitions: List of agent definition strings
|
|
247
|
+
task: Task to execute
|
|
248
|
+
process: Execution process (sequential, parallel)
|
|
249
|
+
llm: LLM model to use
|
|
250
|
+
instructions: Additional instructions
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
Execution result
|
|
254
|
+
"""
|
|
255
|
+
config = self.prepare_execution_config(
|
|
256
|
+
agent_definitions, task, process, llm, instructions
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
return self._execute_agents(
|
|
260
|
+
config['agents'],
|
|
261
|
+
config['task'],
|
|
262
|
+
config['process'],
|
|
263
|
+
config['llm']
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def handle_agents_command(args) -> int:
|
|
268
|
+
"""Handle agents subcommand from CLI.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
args: Parsed command line arguments
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
Exit code (0 for success, non-zero for error)
|
|
275
|
+
"""
|
|
276
|
+
handler = MultiAgentHandler(verbose=True)
|
|
277
|
+
|
|
278
|
+
try:
|
|
279
|
+
if args.agents_command == "run":
|
|
280
|
+
if not hasattr(args, 'agent') or not args.agent:
|
|
281
|
+
print("Error: At least one --agent is required")
|
|
282
|
+
return 1
|
|
283
|
+
|
|
284
|
+
if not hasattr(args, 'task') or not args.task:
|
|
285
|
+
print("Error: --task is required")
|
|
286
|
+
return 1
|
|
287
|
+
|
|
288
|
+
result = handler.run(
|
|
289
|
+
agent_definitions=args.agent,
|
|
290
|
+
task=args.task,
|
|
291
|
+
process=getattr(args, 'process', 'sequential'),
|
|
292
|
+
llm=getattr(args, 'llm', None),
|
|
293
|
+
instructions=getattr(args, 'instructions', None)
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
print("\n" + "="*50)
|
|
297
|
+
print("RESULT:")
|
|
298
|
+
print("="*50)
|
|
299
|
+
print(result)
|
|
300
|
+
|
|
301
|
+
elif args.agents_command == "list":
|
|
302
|
+
# List available tools
|
|
303
|
+
print("\nAvailable tools for agents:")
|
|
304
|
+
print("-" * 30)
|
|
305
|
+
tools = [
|
|
306
|
+
("internet_search", "Search the web"),
|
|
307
|
+
("read_file", "Read file contents"),
|
|
308
|
+
("write_file", "Write to a file"),
|
|
309
|
+
("list_files", "List directory contents"),
|
|
310
|
+
("execute_command", "Execute shell commands"),
|
|
311
|
+
("read_csv", "Read CSV files"),
|
|
312
|
+
("write_csv", "Write CSV files"),
|
|
313
|
+
("analyze_csv", "Analyze CSV data"),
|
|
314
|
+
]
|
|
315
|
+
for name, desc in tools:
|
|
316
|
+
print(f" {name}: {desc}")
|
|
317
|
+
|
|
318
|
+
else:
|
|
319
|
+
print(f"Unknown agents command: {args.agents_command}")
|
|
320
|
+
return 1
|
|
321
|
+
|
|
322
|
+
except Exception as e:
|
|
323
|
+
print(f"Error: {e}")
|
|
324
|
+
return 1
|
|
325
|
+
|
|
326
|
+
return 0
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
def add_agents_parser(subparsers) -> None:
|
|
330
|
+
"""Add agents subcommand to argument parser.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
subparsers: Subparsers object from argparse
|
|
334
|
+
"""
|
|
335
|
+
# run command
|
|
336
|
+
run_parser = subparsers.add_parser(
|
|
337
|
+
'run',
|
|
338
|
+
help='Run multiple agents with a task'
|
|
339
|
+
)
|
|
340
|
+
run_parser.add_argument(
|
|
341
|
+
'--agent', '-a',
|
|
342
|
+
action='append',
|
|
343
|
+
required=True,
|
|
344
|
+
help='Agent definition (format: name:role:tools). Can be used multiple times.'
|
|
345
|
+
)
|
|
346
|
+
run_parser.add_argument(
|
|
347
|
+
'--task', '-t',
|
|
348
|
+
required=True,
|
|
349
|
+
help='Task for the agents to complete'
|
|
350
|
+
)
|
|
351
|
+
run_parser.add_argument(
|
|
352
|
+
'--process', '-p',
|
|
353
|
+
choices=['sequential', 'parallel'],
|
|
354
|
+
default='sequential',
|
|
355
|
+
help='Execution process (default: sequential)'
|
|
356
|
+
)
|
|
357
|
+
run_parser.add_argument(
|
|
358
|
+
'--llm', '-m',
|
|
359
|
+
help='LLM model to use for all agents'
|
|
360
|
+
)
|
|
361
|
+
run_parser.add_argument(
|
|
362
|
+
'--instructions', '-i',
|
|
363
|
+
help='Additional instructions for all agents'
|
|
364
|
+
)
|
|
365
|
+
run_parser.add_argument(
|
|
366
|
+
'--verbose', '-v',
|
|
367
|
+
action='store_true',
|
|
368
|
+
help='Enable verbose output'
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
# list command - list available tools
|
|
372
|
+
list_parser = subparsers.add_parser(
|
|
373
|
+
'list',
|
|
374
|
+
help='List available tools for agents'
|
|
375
|
+
)
|