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,350 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PraisonAI CLI Profiling Commands
|
|
3
|
+
|
|
4
|
+
Provides CLI commands for profiling agent execution.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
praisonai profile run "task" --output report.html
|
|
8
|
+
praisonai profile report --format json
|
|
9
|
+
praisonai profile benchmark --iterations 10
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import time
|
|
13
|
+
import json
|
|
14
|
+
from typing import Optional, Dict, Any
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ProfilingHandler:
|
|
18
|
+
"""
|
|
19
|
+
Handler for CLI profiling commands.
|
|
20
|
+
|
|
21
|
+
Features:
|
|
22
|
+
- Run tasks with profiling enabled
|
|
23
|
+
- Generate reports (console, JSON, HTML)
|
|
24
|
+
- Benchmark agent performance
|
|
25
|
+
- Export flamegraphs
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
self._profiler = None
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def profiler(self):
|
|
33
|
+
"""Lazy load profiler."""
|
|
34
|
+
if self._profiler is None:
|
|
35
|
+
from praisonai.profiler import Profiler
|
|
36
|
+
self._profiler = Profiler
|
|
37
|
+
return self._profiler
|
|
38
|
+
|
|
39
|
+
def enable(self) -> None:
|
|
40
|
+
"""Enable profiling."""
|
|
41
|
+
self.profiler.enable()
|
|
42
|
+
|
|
43
|
+
def disable(self) -> None:
|
|
44
|
+
"""Disable profiling."""
|
|
45
|
+
self.profiler.disable()
|
|
46
|
+
|
|
47
|
+
def clear(self) -> None:
|
|
48
|
+
"""Clear profiling data."""
|
|
49
|
+
self.profiler.clear()
|
|
50
|
+
|
|
51
|
+
def run_with_profiling(self, task: str, config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
52
|
+
"""
|
|
53
|
+
Run a task with profiling enabled.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
task: Task description or prompt
|
|
57
|
+
config: Optional configuration dict
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Dict with result and profiling data
|
|
61
|
+
"""
|
|
62
|
+
self.profiler.enable()
|
|
63
|
+
self.profiler.clear()
|
|
64
|
+
|
|
65
|
+
result = None
|
|
66
|
+
error = None
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
# Import and run PraisonAI
|
|
70
|
+
from praisonai import PraisonAI
|
|
71
|
+
|
|
72
|
+
with self.profiler.block("total_execution"):
|
|
73
|
+
with self.profiler.block("initialization"):
|
|
74
|
+
praison = PraisonAI(auto=task, **(config or {}))
|
|
75
|
+
|
|
76
|
+
with self.profiler.block("agent_run"):
|
|
77
|
+
result = praison.run()
|
|
78
|
+
except Exception as e:
|
|
79
|
+
error = str(e)
|
|
80
|
+
finally:
|
|
81
|
+
self.profiler.disable()
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
'result': result,
|
|
85
|
+
'error': error,
|
|
86
|
+
'summary': self.profiler.get_summary(),
|
|
87
|
+
'statistics': self.profiler.get_statistics()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
def report(self, format: str = "console", output: Optional[str] = None) -> str:
|
|
91
|
+
"""
|
|
92
|
+
Generate profiling report.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
format: Output format (console, json, html)
|
|
96
|
+
output: Optional file path to save report
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Report content as string
|
|
100
|
+
"""
|
|
101
|
+
if format == "console":
|
|
102
|
+
content = self.profiler.report(output="console")
|
|
103
|
+
elif format == "json":
|
|
104
|
+
content = self.profiler.export_json()
|
|
105
|
+
elif format == "html":
|
|
106
|
+
content = self.profiler.export_html()
|
|
107
|
+
else:
|
|
108
|
+
raise ValueError(f"Unknown format: {format}")
|
|
109
|
+
|
|
110
|
+
if output:
|
|
111
|
+
with open(output, 'w') as f:
|
|
112
|
+
f.write(content)
|
|
113
|
+
print(f"Report saved to: {output}")
|
|
114
|
+
|
|
115
|
+
return content
|
|
116
|
+
|
|
117
|
+
def benchmark(self, task: str, iterations: int = 5,
|
|
118
|
+
warmup: int = 1, config: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
119
|
+
"""
|
|
120
|
+
Benchmark agent performance.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
task: Task to benchmark
|
|
124
|
+
iterations: Number of iterations
|
|
125
|
+
warmup: Number of warmup runs
|
|
126
|
+
config: Optional configuration
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
Benchmark results with statistics
|
|
130
|
+
"""
|
|
131
|
+
from praisonai.profiler import Profiler
|
|
132
|
+
|
|
133
|
+
times = []
|
|
134
|
+
errors = []
|
|
135
|
+
|
|
136
|
+
# Warmup runs
|
|
137
|
+
for i in range(warmup):
|
|
138
|
+
print(f"Warmup {i + 1}/{warmup}...")
|
|
139
|
+
try:
|
|
140
|
+
self.run_with_profiling(task, config)
|
|
141
|
+
except Exception as e:
|
|
142
|
+
print(f"Warmup error: {e}")
|
|
143
|
+
|
|
144
|
+
# Benchmark runs
|
|
145
|
+
for i in range(iterations):
|
|
146
|
+
print(f"Iteration {i + 1}/{iterations}...")
|
|
147
|
+
Profiler.clear()
|
|
148
|
+
|
|
149
|
+
start = time.perf_counter()
|
|
150
|
+
try:
|
|
151
|
+
self.run_with_profiling(task, config)
|
|
152
|
+
duration_ms = (time.perf_counter() - start) * 1000
|
|
153
|
+
times.append(duration_ms)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
errors.append(str(e))
|
|
156
|
+
duration_ms = (time.perf_counter() - start) * 1000
|
|
157
|
+
times.append(duration_ms)
|
|
158
|
+
|
|
159
|
+
# Calculate statistics
|
|
160
|
+
if times:
|
|
161
|
+
sorted_times = sorted(times)
|
|
162
|
+
n = len(sorted_times)
|
|
163
|
+
|
|
164
|
+
results = {
|
|
165
|
+
'iterations': iterations,
|
|
166
|
+
'successful': iterations - len(errors),
|
|
167
|
+
'failed': len(errors),
|
|
168
|
+
'times_ms': times,
|
|
169
|
+
'mean_ms': sum(times) / n,
|
|
170
|
+
'min_ms': min(times),
|
|
171
|
+
'max_ms': max(times),
|
|
172
|
+
'p50_ms': sorted_times[n // 2],
|
|
173
|
+
'p95_ms': sorted_times[int(n * 0.95)] if n > 1 else sorted_times[-1],
|
|
174
|
+
'p99_ms': sorted_times[int(n * 0.99)] if n > 1 else sorted_times[-1],
|
|
175
|
+
'errors': errors
|
|
176
|
+
}
|
|
177
|
+
else:
|
|
178
|
+
results = {
|
|
179
|
+
'iterations': iterations,
|
|
180
|
+
'successful': 0,
|
|
181
|
+
'failed': len(errors),
|
|
182
|
+
'errors': errors
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return results
|
|
186
|
+
|
|
187
|
+
def export_flamegraph(self, filepath: str) -> None:
|
|
188
|
+
"""Export flamegraph to SVG file."""
|
|
189
|
+
self.profiler.export_flamegraph(filepath)
|
|
190
|
+
print(f"Flamegraph saved to: {filepath}")
|
|
191
|
+
|
|
192
|
+
def get_summary(self) -> Dict[str, Any]:
|
|
193
|
+
"""Get profiling summary."""
|
|
194
|
+
return self.profiler.get_summary()
|
|
195
|
+
|
|
196
|
+
def get_statistics(self, category: Optional[str] = None) -> Dict[str, float]:
|
|
197
|
+
"""Get profiling statistics."""
|
|
198
|
+
return self.profiler.get_statistics(category)
|
|
199
|
+
|
|
200
|
+
def print_summary(self) -> None:
|
|
201
|
+
"""Print profiling summary to console."""
|
|
202
|
+
summary = self.get_summary()
|
|
203
|
+
stats = self.get_statistics()
|
|
204
|
+
|
|
205
|
+
print("\n" + "=" * 60)
|
|
206
|
+
print("PROFILING SUMMARY")
|
|
207
|
+
print("=" * 60)
|
|
208
|
+
|
|
209
|
+
print(f"\nTotal Time: {summary['total_time_ms']:.2f}ms")
|
|
210
|
+
print(f"Operations: {summary['timing_count']}")
|
|
211
|
+
print(f"Imports: {summary['import_count']}")
|
|
212
|
+
print(f"Flow Steps: {summary['flow_steps']}")
|
|
213
|
+
|
|
214
|
+
print("\nStatistics:")
|
|
215
|
+
print(f" P50 (Median): {stats['p50']:.2f}ms")
|
|
216
|
+
print(f" P95: {stats['p95']:.2f}ms")
|
|
217
|
+
print(f" P99: {stats['p99']:.2f}ms")
|
|
218
|
+
print(f" Mean: {stats['mean']:.2f}ms")
|
|
219
|
+
print(f" Std Dev: {stats['std_dev']:.2f}ms")
|
|
220
|
+
|
|
221
|
+
print("\nSlowest Operations:")
|
|
222
|
+
for name, duration in summary['slowest_operations'][:5]:
|
|
223
|
+
print(f" {name}: {duration:.2f}ms")
|
|
224
|
+
|
|
225
|
+
print("=" * 60)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def handle_profile_command(args) -> int:
|
|
229
|
+
"""
|
|
230
|
+
Handle profile CLI command.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
args: Parsed command line arguments
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
Exit code (0 for success)
|
|
237
|
+
"""
|
|
238
|
+
handler = ProfilingHandler()
|
|
239
|
+
|
|
240
|
+
subcommand = getattr(args, 'profile_command', None)
|
|
241
|
+
|
|
242
|
+
if subcommand == 'run':
|
|
243
|
+
task = getattr(args, 'task', '')
|
|
244
|
+
output = getattr(args, 'output', None)
|
|
245
|
+
format_type = getattr(args, 'format', 'console')
|
|
246
|
+
|
|
247
|
+
print(f"Running with profiling: {task[:50]}...")
|
|
248
|
+
result = handler.run_with_profiling(task)
|
|
249
|
+
|
|
250
|
+
if result['error']:
|
|
251
|
+
print(f"Error: {result['error']}")
|
|
252
|
+
|
|
253
|
+
handler.report(format=format_type, output=output)
|
|
254
|
+
return 0 if not result['error'] else 1
|
|
255
|
+
|
|
256
|
+
elif subcommand == 'report':
|
|
257
|
+
output = getattr(args, 'output', None)
|
|
258
|
+
format_type = getattr(args, 'format', 'console')
|
|
259
|
+
|
|
260
|
+
handler.report(format=format_type, output=output)
|
|
261
|
+
return 0
|
|
262
|
+
|
|
263
|
+
elif subcommand == 'benchmark':
|
|
264
|
+
task = getattr(args, 'task', '')
|
|
265
|
+
iterations = getattr(args, 'iterations', 5)
|
|
266
|
+
warmup = getattr(args, 'warmup', 1)
|
|
267
|
+
output = getattr(args, 'output', None)
|
|
268
|
+
|
|
269
|
+
print(f"Benchmarking: {task[:50]}...")
|
|
270
|
+
results = handler.benchmark(task, iterations=iterations, warmup=warmup)
|
|
271
|
+
|
|
272
|
+
print("\n" + "=" * 60)
|
|
273
|
+
print("BENCHMARK RESULTS")
|
|
274
|
+
print("=" * 60)
|
|
275
|
+
print(f"Iterations: {results['iterations']}")
|
|
276
|
+
print(f"Successful: {results['successful']}")
|
|
277
|
+
print(f"Failed: {results['failed']}")
|
|
278
|
+
|
|
279
|
+
if 'mean_ms' in results:
|
|
280
|
+
print("\nTiming:")
|
|
281
|
+
print(f" Mean: {results['mean_ms']:.2f}ms")
|
|
282
|
+
print(f" Min: {results['min_ms']:.2f}ms")
|
|
283
|
+
print(f" Max: {results['max_ms']:.2f}ms")
|
|
284
|
+
print(f" P50: {results['p50_ms']:.2f}ms")
|
|
285
|
+
print(f" P95: {results['p95_ms']:.2f}ms")
|
|
286
|
+
|
|
287
|
+
if output:
|
|
288
|
+
with open(output, 'w') as f:
|
|
289
|
+
json.dump(results, f, indent=2)
|
|
290
|
+
print(f"\nResults saved to: {output}")
|
|
291
|
+
|
|
292
|
+
return 0
|
|
293
|
+
|
|
294
|
+
elif subcommand == 'flamegraph':
|
|
295
|
+
output = getattr(args, 'output', 'profile.svg')
|
|
296
|
+
handler.export_flamegraph(output)
|
|
297
|
+
return 0
|
|
298
|
+
|
|
299
|
+
elif subcommand == 'summary':
|
|
300
|
+
handler.print_summary()
|
|
301
|
+
return 0
|
|
302
|
+
|
|
303
|
+
else:
|
|
304
|
+
print("Usage: praisonai profile <run|report|benchmark|flamegraph|summary>")
|
|
305
|
+
return 1
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def add_profile_parser(subparsers) -> None:
|
|
309
|
+
"""Add profile subcommand to argument parser."""
|
|
310
|
+
profile_parser = subparsers.add_parser(
|
|
311
|
+
'profile',
|
|
312
|
+
help='Profile agent execution'
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
profile_subparsers = profile_parser.add_subparsers(dest='profile_command')
|
|
316
|
+
|
|
317
|
+
# Run with profiling
|
|
318
|
+
run_parser = profile_subparsers.add_parser('run', help='Run task with profiling')
|
|
319
|
+
run_parser.add_argument('task', help='Task to run')
|
|
320
|
+
run_parser.add_argument('--output', '-o', help='Output file path')
|
|
321
|
+
run_parser.add_argument('--format', '-f', choices=['console', 'json', 'html'],
|
|
322
|
+
default='console', help='Output format')
|
|
323
|
+
|
|
324
|
+
# Generate report
|
|
325
|
+
report_parser = profile_subparsers.add_parser('report', help='Generate profiling report')
|
|
326
|
+
report_parser.add_argument('--output', '-o', help='Output file path')
|
|
327
|
+
report_parser.add_argument('--format', '-f', choices=['console', 'json', 'html'],
|
|
328
|
+
default='console', help='Output format')
|
|
329
|
+
|
|
330
|
+
# Benchmark
|
|
331
|
+
bench_parser = profile_subparsers.add_parser('benchmark', help='Benchmark agent performance')
|
|
332
|
+
bench_parser.add_argument('task', help='Task to benchmark')
|
|
333
|
+
bench_parser.add_argument('--iterations', '-n', type=int, default=5, help='Number of iterations')
|
|
334
|
+
bench_parser.add_argument('--warmup', '-w', type=int, default=1, help='Warmup runs')
|
|
335
|
+
bench_parser.add_argument('--output', '-o', help='Output file for results')
|
|
336
|
+
|
|
337
|
+
# Flamegraph
|
|
338
|
+
flame_parser = profile_subparsers.add_parser('flamegraph', help='Export flamegraph')
|
|
339
|
+
flame_parser.add_argument('--output', '-o', default='profile.svg', help='Output SVG file')
|
|
340
|
+
|
|
341
|
+
# Summary
|
|
342
|
+
profile_subparsers.add_parser('summary', help='Print profiling summary') # noqa: F841
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
# Exports
|
|
346
|
+
__all__ = [
|
|
347
|
+
'ProfilingHandler',
|
|
348
|
+
'handle_profile_command',
|
|
349
|
+
'add_profile_parser',
|
|
350
|
+
]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Queue System for PraisonAI TUI.
|
|
3
|
+
|
|
4
|
+
Provides multi-run, multi-agent queueing with priorities, cancel/retry,
|
|
5
|
+
streaming output, and persistence.
|
|
6
|
+
|
|
7
|
+
Lazy-loaded to avoid import overhead when not used.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from .models import QueuedRun, RunState, RunPriority, QueueConfig
|
|
14
|
+
from .scheduler import QueueScheduler
|
|
15
|
+
from .worker import WorkerPool
|
|
16
|
+
from .persistence import QueuePersistence
|
|
17
|
+
|
|
18
|
+
_lazy_cache = {}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def __getattr__(name: str):
|
|
22
|
+
"""Lazy load queue components."""
|
|
23
|
+
global _lazy_cache
|
|
24
|
+
|
|
25
|
+
if name in _lazy_cache:
|
|
26
|
+
return _lazy_cache[name]
|
|
27
|
+
|
|
28
|
+
if name == "QueuedRun":
|
|
29
|
+
from .models import QueuedRun
|
|
30
|
+
_lazy_cache[name] = QueuedRun
|
|
31
|
+
return QueuedRun
|
|
32
|
+
elif name == "RunState":
|
|
33
|
+
from .models import RunState
|
|
34
|
+
_lazy_cache[name] = RunState
|
|
35
|
+
return RunState
|
|
36
|
+
elif name == "RunPriority":
|
|
37
|
+
from .models import RunPriority
|
|
38
|
+
_lazy_cache[name] = RunPriority
|
|
39
|
+
return RunPriority
|
|
40
|
+
elif name == "QueueConfig":
|
|
41
|
+
from .models import QueueConfig
|
|
42
|
+
_lazy_cache[name] = QueueConfig
|
|
43
|
+
return QueueConfig
|
|
44
|
+
elif name == "QueueScheduler":
|
|
45
|
+
from .scheduler import QueueScheduler
|
|
46
|
+
_lazy_cache[name] = QueueScheduler
|
|
47
|
+
return QueueScheduler
|
|
48
|
+
elif name == "WorkerPool":
|
|
49
|
+
from .worker import WorkerPool
|
|
50
|
+
_lazy_cache[name] = WorkerPool
|
|
51
|
+
return WorkerPool
|
|
52
|
+
elif name == "QueuePersistence":
|
|
53
|
+
from .persistence import QueuePersistence
|
|
54
|
+
_lazy_cache[name] = QueuePersistence
|
|
55
|
+
return QueuePersistence
|
|
56
|
+
elif name == "QueueManager":
|
|
57
|
+
from .manager import QueueManager
|
|
58
|
+
_lazy_cache[name] = QueueManager
|
|
59
|
+
return QueueManager
|
|
60
|
+
|
|
61
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
__all__ = [
|
|
65
|
+
"QueuedRun",
|
|
66
|
+
"RunState",
|
|
67
|
+
"RunPriority",
|
|
68
|
+
"QueueConfig",
|
|
69
|
+
"QueueScheduler",
|
|
70
|
+
"WorkerPool",
|
|
71
|
+
"QueuePersistence",
|
|
72
|
+
"QueueManager",
|
|
73
|
+
]
|