praisonai-code 0.0.1__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_code/__init__.py +17 -0
- praisonai_code/cli/__init__.py +12 -0
- praisonai_code/cli/_forward_shim.py +10 -0
- praisonai_code/cli/_paths.py +88 -0
- praisonai_code/cli/_warnings.py +58 -0
- praisonai_code/cli/app.py +757 -0
- praisonai_code/cli/approval_backend.py +272 -0
- praisonai_code/cli/branding.py +94 -0
- praisonai_code/cli/commands/__init__.py +114 -0
- praisonai_code/cli/commands/acp.py +80 -0
- praisonai_code/cli/commands/agent.py +116 -0
- praisonai_code/cli/commands/agents.py +80 -0
- praisonai_code/cli/commands/app.py +139 -0
- praisonai_code/cli/commands/attach.py +95 -0
- praisonai_code/cli/commands/audit.py +102 -0
- praisonai_code/cli/commands/auth.py +508 -0
- praisonai_code/cli/commands/batch.py +848 -0
- praisonai_code/cli/commands/benchmark.py +286 -0
- praisonai_code/cli/commands/browser.py +299 -0
- praisonai_code/cli/commands/call.py +45 -0
- praisonai_code/cli/commands/chat.py +332 -0
- praisonai_code/cli/commands/checkpoint.py +170 -0
- praisonai_code/cli/commands/code.py +276 -0
- praisonai_code/cli/commands/command.py +114 -0
- praisonai_code/cli/commands/commit.py +47 -0
- praisonai_code/cli/commands/completion.py +333 -0
- praisonai_code/cli/commands/config.py +681 -0
- praisonai_code/cli/commands/context.py +414 -0
- praisonai_code/cli/commands/daemon.py +203 -0
- praisonai_code/cli/commands/debug.py +142 -0
- praisonai_code/cli/commands/deploy.py +71 -0
- praisonai_code/cli/commands/diag.py +55 -0
- praisonai_code/cli/commands/docs.py +1575 -0
- praisonai_code/cli/commands/doctor.py +332 -0
- praisonai_code/cli/commands/endpoints.py +51 -0
- praisonai_code/cli/commands/environment.py +179 -0
- praisonai_code/cli/commands/eval.py +131 -0
- praisonai_code/cli/commands/examples.py +953 -0
- praisonai_code/cli/commands/flow.py +436 -0
- praisonai_code/cli/commands/github.py +752 -0
- praisonai_code/cli/commands/hooks.py +74 -0
- praisonai_code/cli/commands/init.py +174 -0
- praisonai_code/cli/commands/knowledge.py +440 -0
- praisonai_code/cli/commands/langextract.py +120 -0
- praisonai_code/cli/commands/langfuse.py +984 -0
- praisonai_code/cli/commands/loop.py +211 -0
- praisonai_code/cli/commands/lsp.py +112 -0
- praisonai_code/cli/commands/managed.py +659 -0
- praisonai_code/cli/commands/mcp.py +763 -0
- praisonai_code/cli/commands/memory.py +298 -0
- praisonai_code/cli/commands/models.py +264 -0
- praisonai_code/cli/commands/n8n.py +326 -0
- praisonai_code/cli/commands/obs.py +19 -0
- praisonai_code/cli/commands/package.py +76 -0
- praisonai_code/cli/commands/paths.py +106 -0
- praisonai_code/cli/commands/permissions.py +272 -0
- praisonai_code/cli/commands/plugins.py +609 -0
- praisonai_code/cli/commands/port.py +530 -0
- praisonai_code/cli/commands/profile.py +466 -0
- praisonai_code/cli/commands/publish.py +193 -0
- praisonai_code/cli/commands/rag.py +913 -0
- praisonai_code/cli/commands/realtime.py +52 -0
- praisonai_code/cli/commands/recipe.py +684 -0
- praisonai_code/cli/commands/registry.py +59 -0
- praisonai_code/cli/commands/replay.py +830 -0
- praisonai_code/cli/commands/research.py +49 -0
- praisonai_code/cli/commands/retrieval.py +377 -0
- praisonai_code/cli/commands/rules.py +71 -0
- praisonai_code/cli/commands/run.py +1573 -0
- praisonai_code/cli/commands/sandbox.py +371 -0
- praisonai_code/cli/commands/schedule.py +529 -0
- praisonai_code/cli/commands/serve.py +690 -0
- praisonai_code/cli/commands/session.py +450 -0
- praisonai_code/cli/commands/setup.py +174 -0
- praisonai_code/cli/commands/skills.py +545 -0
- praisonai_code/cli/commands/standardise.py +711 -0
- praisonai_code/cli/commands/templates.py +54 -0
- praisonai_code/cli/commands/test.py +558 -0
- praisonai_code/cli/commands/todo.py +74 -0
- praisonai_code/cli/commands/tools.py +205 -0
- praisonai_code/cli/commands/traces.py +145 -0
- praisonai_code/cli/commands/tracker.py +852 -0
- praisonai_code/cli/commands/train.py +613 -0
- praisonai_code/cli/commands/ui.py +172 -0
- praisonai_code/cli/commands/up.py +354 -0
- praisonai_code/cli/commands/validate.py +291 -0
- praisonai_code/cli/commands/version.py +101 -0
- praisonai_code/cli/commands/workflow.py +97 -0
- praisonai_code/cli/config_loader.py +437 -0
- praisonai_code/cli/configuration/__init__.py +27 -0
- praisonai_code/cli/configuration/config.schema.json +57 -0
- praisonai_code/cli/configuration/credentials.py +446 -0
- praisonai_code/cli/configuration/loader.py +364 -0
- praisonai_code/cli/configuration/model_resolver.py +161 -0
- praisonai_code/cli/configuration/oauth.py +389 -0
- praisonai_code/cli/configuration/paths.py +224 -0
- praisonai_code/cli/configuration/resolver.py +687 -0
- praisonai_code/cli/configuration/schema.py +317 -0
- praisonai_code/cli/execution/__init__.py +99 -0
- praisonai_code/cli/execution/core.py +208 -0
- praisonai_code/cli/execution/profiler.py +898 -0
- praisonai_code/cli/execution/request.py +85 -0
- praisonai_code/cli/execution/result.py +74 -0
- praisonai_code/cli/fallback_schema.py +416 -0
- praisonai_code/cli/features/__init__.py +278 -0
- praisonai_code/cli/features/_endpoint_registry.py +64 -0
- praisonai_code/cli/features/_search_registry.py +43 -0
- praisonai_code/cli/features/acp.py +236 -0
- praisonai_code/cli/features/action_orchestrator.py +576 -0
- praisonai_code/cli/features/agent_scheduler.py +773 -0
- praisonai_code/cli/features/agent_tools.py +603 -0
- praisonai_code/cli/features/agents.py +397 -0
- praisonai_code/cli/features/at_mentions.py +471 -0
- praisonai_code/cli/features/audit_cli.py +270 -0
- praisonai_code/cli/features/auto_memory.py +182 -0
- praisonai_code/cli/features/auto_mode.py +552 -0
- praisonai_code/cli/features/autonomy_mode.py +546 -0
- praisonai_code/cli/features/background.py +356 -0
- praisonai_code/cli/features/base.py +168 -0
- praisonai_code/cli/features/benchmark.py +1462 -0
- praisonai_code/cli/features/capabilities.py +1326 -0
- praisonai_code/cli/features/checkpoints.py +345 -0
- praisonai_code/cli/features/cli_profiler.py +335 -0
- praisonai_code/cli/features/code_intelligence.py +666 -0
- praisonai_code/cli/features/compaction.py +294 -0
- praisonai_code/cli/features/compare.py +534 -0
- praisonai_code/cli/features/config_hierarchy.py +366 -0
- praisonai_code/cli/features/context_manager.py +597 -0
- praisonai_code/cli/features/cost_tracker.py +514 -0
- praisonai_code/cli/features/csv_test_runner.py +736 -0
- praisonai_code/cli/features/custom_definitions.py +790 -0
- praisonai_code/cli/features/debug.py +810 -0
- praisonai_code/cli/features/deploy.py +605 -0
- praisonai_code/cli/features/diag.py +289 -0
- praisonai_code/cli/features/display_jsonl.py +173 -0
- praisonai_code/cli/features/doctor/__init__.py +63 -0
- praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
- praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
- praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
- praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
- praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
- praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
- praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
- praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
- praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
- praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
- praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai_code/cli/features/doctor/engine.py +266 -0
- praisonai_code/cli/features/doctor/formatters.py +377 -0
- praisonai_code/cli/features/doctor/handler.py +564 -0
- praisonai_code/cli/features/doctor/models.py +276 -0
- praisonai_code/cli/features/doctor/registry.py +239 -0
- praisonai_code/cli/features/endpoints.py +1016 -0
- praisonai_code/cli/features/eval.py +559 -0
- praisonai_code/cli/features/examples.py +707 -0
- praisonai_code/cli/features/external_agents.py +231 -0
- praisonai_code/cli/features/fast_context.py +410 -0
- praisonai_code/cli/features/file_history.py +320 -0
- praisonai_code/cli/features/flow_display.py +566 -0
- praisonai_code/cli/features/git_attribution.py +159 -0
- praisonai_code/cli/features/git_integration.py +651 -0
- praisonai_code/cli/features/guardrail.py +171 -0
- praisonai_code/cli/features/handoff.py +252 -0
- praisonai_code/cli/features/hooks.py +583 -0
- praisonai_code/cli/features/hybrid_workflow.py +391 -0
- praisonai_code/cli/features/image.py +384 -0
- praisonai_code/cli/features/interactive_core_headless.py +450 -0
- praisonai_code/cli/features/interactive_runtime.py +600 -0
- praisonai_code/cli/features/interactive_test_harness.py +537 -0
- praisonai_code/cli/features/interactive_tools.py +428 -0
- praisonai_code/cli/features/interactive_tui.py +603 -0
- praisonai_code/cli/features/job_workflow.py +906 -0
- praisonai_code/cli/features/jobs.py +632 -0
- praisonai_code/cli/features/knowledge.py +531 -0
- praisonai_code/cli/features/knowledge_cli.py +438 -0
- praisonai_code/cli/features/lite.py +244 -0
- praisonai_code/cli/features/logs.py +200 -0
- praisonai_code/cli/features/lsp_cli.py +225 -0
- praisonai_code/cli/features/lsp_diagnostics.py +185 -0
- praisonai_code/cli/features/mcp.py +344 -0
- praisonai_code/cli/features/message_queue.py +587 -0
- praisonai_code/cli/features/metrics.py +210 -0
- praisonai_code/cli/features/migrate.py +1329 -0
- praisonai_code/cli/features/migration_flow.py +463 -0
- praisonai_code/cli/features/migration_spec.py +276 -0
- praisonai_code/cli/features/n8n.py +703 -0
- praisonai_code/cli/features/observability.py +293 -0
- praisonai_code/cli/features/ollama.py +361 -0
- praisonai_code/cli/features/output_modes.py +155 -0
- praisonai_code/cli/features/output_style.py +273 -0
- praisonai_code/cli/features/package.py +631 -0
- praisonai_code/cli/features/performance.py +308 -0
- praisonai_code/cli/features/persistence.py +636 -0
- praisonai_code/cli/features/profiler/__init__.py +81 -0
- praisonai_code/cli/features/profiler/core.py +558 -0
- praisonai_code/cli/features/profiler/optimizations.py +652 -0
- praisonai_code/cli/features/profiler/suite.py +386 -0
- praisonai_code/cli/features/queue/__init__.py +73 -0
- praisonai_code/cli/features/queue/manager.py +435 -0
- praisonai_code/cli/features/queue/models.py +289 -0
- praisonai_code/cli/features/queue/persistence.py +564 -0
- praisonai_code/cli/features/queue/scheduler.py +529 -0
- praisonai_code/cli/features/queue/worker.py +400 -0
- praisonai_code/cli/features/recipe.py +2187 -0
- praisonai_code/cli/features/recipe_creator.py +996 -0
- praisonai_code/cli/features/recipe_optimizer.py +1364 -0
- praisonai_code/cli/features/recipe_prompts.py +226 -0
- praisonai_code/cli/features/registry.py +229 -0
- praisonai_code/cli/features/repo_map.py +860 -0
- praisonai_code/cli/features/router.py +466 -0
- praisonai_code/cli/features/safe_shell.py +427 -0
- praisonai_code/cli/features/sandbox_cli.py +283 -0
- praisonai_code/cli/features/sandbox_executor.py +536 -0
- praisonai_code/cli/features/sdk_knowledge.py +500 -0
- praisonai_code/cli/features/session.py +222 -0
- praisonai_code/cli/features/session_checkpoints.py +208 -0
- praisonai_code/cli/features/setup/__init__.py +9 -0
- praisonai_code/cli/features/setup/handler.py +355 -0
- praisonai_code/cli/features/setup/templates.py +62 -0
- praisonai_code/cli/features/skills.py +940 -0
- praisonai_code/cli/features/slash_commands.py +692 -0
- praisonai_code/cli/features/telemetry.py +179 -0
- praisonai_code/cli/features/templates.py +1390 -0
- praisonai_code/cli/features/thinking.py +343 -0
- praisonai_code/cli/features/todo.py +334 -0
- praisonai_code/cli/features/tools.py +680 -0
- praisonai_code/cli/features/tui/__init__.py +83 -0
- praisonai_code/cli/features/tui/app.py +871 -0
- praisonai_code/cli/features/tui/cli.py +580 -0
- praisonai_code/cli/features/tui/config.py +150 -0
- praisonai_code/cli/features/tui/debug.py +526 -0
- praisonai_code/cli/features/tui/events.py +99 -0
- praisonai_code/cli/features/tui/mock_provider.py +328 -0
- praisonai_code/cli/features/tui/orchestrator.py +652 -0
- praisonai_code/cli/features/tui/screens/__init__.py +50 -0
- praisonai_code/cli/features/tui/screens/help.py +157 -0
- praisonai_code/cli/features/tui/screens/main.py +568 -0
- praisonai_code/cli/features/tui/screens/queue.py +174 -0
- praisonai_code/cli/features/tui/screens/session.py +124 -0
- praisonai_code/cli/features/tui/screens/settings.py +148 -0
- praisonai_code/cli/features/tui/session_store.py +198 -0
- praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
- praisonai_code/cli/features/tui/widgets/chat.py +263 -0
- praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
- praisonai_code/cli/features/tui/widgets/composer.py +292 -0
- praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
- praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
- praisonai_code/cli/features/tui/widgets/status.py +181 -0
- praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
- praisonai_code/cli/features/wizard.py +289 -0
- praisonai_code/cli/features/workflow.py +802 -0
- praisonai_code/cli/features/yaml_utils.py +321 -0
- praisonai_code/cli/interactive/__init__.py +48 -0
- praisonai_code/cli/interactive/async_tui.py +1218 -0
- praisonai_code/cli/interactive/config.py +139 -0
- praisonai_code/cli/interactive/core.py +618 -0
- praisonai_code/cli/interactive/events.py +131 -0
- praisonai_code/cli/interactive/frontends/__init__.py +31 -0
- praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
- praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
- praisonai_code/cli/interactive/praison_io.py +502 -0
- praisonai_code/cli/interactive/repl.py +297 -0
- praisonai_code/cli/interactive/split_tui.py +456 -0
- praisonai_code/cli/interactive/tui_app.py +457 -0
- praisonai_code/cli/langfuse_client.py +360 -0
- praisonai_code/cli/main.py +7421 -0
- praisonai_code/cli/output/__init__.py +25 -0
- praisonai_code/cli/output/console.py +456 -0
- praisonai_code/cli/output/event_bridge.py +191 -0
- praisonai_code/cli/schedule_cli.py +54 -0
- praisonai_code/cli/schema_provider.py +23 -0
- praisonai_code/cli/session/__init__.py +16 -0
- praisonai_code/cli/session/resume.py +148 -0
- praisonai_code/cli/session/unified.py +548 -0
- praisonai_code/cli/state/__init__.py +31 -0
- praisonai_code/cli/state/identifiers.py +161 -0
- praisonai_code/cli/state/project_sessions.py +383 -0
- praisonai_code/cli/state/sessions.py +390 -0
- praisonai_code/cli/ui/__init__.py +160 -0
- praisonai_code/cli/ui/config.py +46 -0
- praisonai_code/cli/ui/events.py +61 -0
- praisonai_code/cli/ui/mg_backend.py +342 -0
- praisonai_code/cli/ui/plain.py +133 -0
- praisonai_code/cli/ui/rich_backend.py +162 -0
- praisonai_code/cli/unified_schema.py +655 -0
- praisonai_code/cli/utils/env_utils.py +126 -0
- praisonai_code/cli/utils/project.py +131 -0
- praisonai_code/cli_backends/__init__.py +73 -0
- praisonai_code/cli_backends/claude.py +373 -0
- praisonai_code/cli_backends/registry.py +113 -0
- praisonai_code/runtime/__init__.py +36 -0
- praisonai_code/runtime/__main__.py +81 -0
- praisonai_code/runtime/client.py +131 -0
- praisonai_code/runtime/descriptor.py +209 -0
- praisonai_code/runtime/server.py +356 -0
- praisonai_code-0.0.1.dist-info/METADATA +80 -0
- praisonai_code-0.0.1.dist-info/RECORD +309 -0
- praisonai_code-0.0.1.dist-info/WHEEL +5 -0
- praisonai_code-0.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agents command group for PraisonAI CLI.
|
|
3
|
+
|
|
4
|
+
Provides agent management commands.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
app = typer.Typer(help="Agent management")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.command("list")
|
|
13
|
+
def agents_list(
|
|
14
|
+
verbose: bool = typer.Option(False, "--verbose", "-v", help="Show detailed info"),
|
|
15
|
+
):
|
|
16
|
+
"""List available agents."""
|
|
17
|
+
from praisonai.cli.main import PraisonAI
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
argv = ['agents', 'list']
|
|
21
|
+
if verbose:
|
|
22
|
+
argv.append('--verbose')
|
|
23
|
+
|
|
24
|
+
original_argv = sys.argv
|
|
25
|
+
sys.argv = ['praisonai'] + argv
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
praison = PraisonAI()
|
|
29
|
+
praison.main()
|
|
30
|
+
except SystemExit:
|
|
31
|
+
pass
|
|
32
|
+
finally:
|
|
33
|
+
sys.argv = original_argv
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@app.command("create")
|
|
37
|
+
def agents_create(
|
|
38
|
+
name: str = typer.Argument(..., help="Agent name"),
|
|
39
|
+
template: str = typer.Option(None, "--template", "-t", help="Template to use"),
|
|
40
|
+
):
|
|
41
|
+
"""Create a new agent."""
|
|
42
|
+
from praisonai.cli.main import PraisonAI
|
|
43
|
+
import sys
|
|
44
|
+
|
|
45
|
+
argv = ['agents', 'create', name]
|
|
46
|
+
if template:
|
|
47
|
+
argv.extend(['--template', template])
|
|
48
|
+
|
|
49
|
+
original_argv = sys.argv
|
|
50
|
+
sys.argv = ['praisonai'] + argv
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
praison = PraisonAI()
|
|
54
|
+
praison.main()
|
|
55
|
+
except SystemExit:
|
|
56
|
+
pass
|
|
57
|
+
finally:
|
|
58
|
+
sys.argv = original_argv
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@app.command("info")
|
|
62
|
+
def agents_info(
|
|
63
|
+
name: str = typer.Argument(..., help="Agent name"),
|
|
64
|
+
):
|
|
65
|
+
"""Show agent information."""
|
|
66
|
+
from praisonai.cli.main import PraisonAI
|
|
67
|
+
import sys
|
|
68
|
+
|
|
69
|
+
argv = ['agents', 'info', name]
|
|
70
|
+
|
|
71
|
+
original_argv = sys.argv
|
|
72
|
+
sys.argv = ['praisonai'] + argv
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
praison = PraisonAI()
|
|
76
|
+
praison.main()
|
|
77
|
+
except SystemExit:
|
|
78
|
+
pass
|
|
79
|
+
finally:
|
|
80
|
+
sys.argv = original_argv
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI command for AgentOS - production deployment of AI agents.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
praisonai app # Start server with default config
|
|
6
|
+
praisonai app --port 9000 # Start on custom port
|
|
7
|
+
praisonai app --config app.yaml # Load from config file
|
|
8
|
+
praisonai app --reload # Enable auto-reload for development
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import click
|
|
12
|
+
from typing import Optional
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@click.command("app")
|
|
16
|
+
@click.option("--port", "-p", type=int, default=8000, help="Port to listen on")
|
|
17
|
+
@click.option("--host", "-h", type=str, default="0.0.0.0", help="Host to bind to")
|
|
18
|
+
@click.option("--config", "-c", type=click.Path(exists=True), help="Path to config file (YAML)")
|
|
19
|
+
@click.option("--reload", "-r", is_flag=True, help="Enable auto-reload for development")
|
|
20
|
+
@click.option("--debug", "-d", is_flag=True, help="Enable debug mode")
|
|
21
|
+
@click.option("--name", "-n", type=str, default="PraisonAI App", help="Application name")
|
|
22
|
+
def app_command(
|
|
23
|
+
port: int,
|
|
24
|
+
host: str,
|
|
25
|
+
config: Optional[str],
|
|
26
|
+
reload: bool,
|
|
27
|
+
debug: bool,
|
|
28
|
+
name: str,
|
|
29
|
+
):
|
|
30
|
+
"""
|
|
31
|
+
Start an AgentOS server for production deployment.
|
|
32
|
+
|
|
33
|
+
AgentOS provides a FastAPI-based web service for deploying AI agents
|
|
34
|
+
with REST and WebSocket endpoints.
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
|
|
38
|
+
# Start with defaults (port 8000)
|
|
39
|
+
praisonai app
|
|
40
|
+
|
|
41
|
+
# Start on custom port
|
|
42
|
+
praisonai app --port 9000
|
|
43
|
+
|
|
44
|
+
# Enable auto-reload for development
|
|
45
|
+
praisonai app --reload
|
|
46
|
+
|
|
47
|
+
# Load agents from config file
|
|
48
|
+
praisonai app --config agents.yaml
|
|
49
|
+
"""
|
|
50
|
+
from rich.console import Console
|
|
51
|
+
console = Console()
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
from praisonai import AgentOS
|
|
55
|
+
from praisonaiagents import AgentOSConfig
|
|
56
|
+
except ImportError as e:
|
|
57
|
+
console.print(f"[red]Error importing AgentOS: {e}[/red]")
|
|
58
|
+
console.print("[yellow]Install with: pip install praisonai[api][/yellow]")
|
|
59
|
+
raise click.Abort()
|
|
60
|
+
|
|
61
|
+
# Load agents from config file if provided
|
|
62
|
+
agents = []
|
|
63
|
+
if config:
|
|
64
|
+
agents = _load_agents_from_config(config, console)
|
|
65
|
+
|
|
66
|
+
# Create config
|
|
67
|
+
app_config = AgentOSConfig(
|
|
68
|
+
name=name,
|
|
69
|
+
host=host,
|
|
70
|
+
port=port,
|
|
71
|
+
reload=reload,
|
|
72
|
+
debug=debug,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Create and start app
|
|
76
|
+
console.print(f"\n[bold green]🚀 Starting {name}[/bold green]")
|
|
77
|
+
console.print(f"[dim]Host: {host}:{port}[/dim]")
|
|
78
|
+
if agents:
|
|
79
|
+
console.print(f"[dim]Agents: {len(agents)}[/dim]")
|
|
80
|
+
if reload:
|
|
81
|
+
console.print("[yellow]Auto-reload enabled (development mode)[/yellow]")
|
|
82
|
+
console.print()
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
agent_app = AgentOS(
|
|
86
|
+
name=name,
|
|
87
|
+
agents=agents,
|
|
88
|
+
config=app_config,
|
|
89
|
+
)
|
|
90
|
+
agent_app.serve()
|
|
91
|
+
except ImportError as e:
|
|
92
|
+
console.print(f"[red]Missing dependency: {e}[/red]")
|
|
93
|
+
console.print("[yellow]Install with: pip install praisonai[api][/yellow]")
|
|
94
|
+
raise click.Abort()
|
|
95
|
+
except Exception as e:
|
|
96
|
+
console.print(f"[red]Error starting server: {e}[/red]")
|
|
97
|
+
raise click.Abort()
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _load_agents_from_config(config_path: str, console) -> list:
|
|
101
|
+
"""Load agents from a YAML config file."""
|
|
102
|
+
import yaml
|
|
103
|
+
from pathlib import Path
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
with open(config_path, 'r') as f:
|
|
107
|
+
config_data = yaml.safe_load(f)
|
|
108
|
+
except Exception as e:
|
|
109
|
+
console.print(f"[red]Error loading config: {e}[/red]")
|
|
110
|
+
return []
|
|
111
|
+
|
|
112
|
+
if not config_data:
|
|
113
|
+
return []
|
|
114
|
+
|
|
115
|
+
agents = []
|
|
116
|
+
|
|
117
|
+
# Try to load agents from config
|
|
118
|
+
agents_config = config_data.get('agents', [])
|
|
119
|
+
if not agents_config and 'agent' in config_data:
|
|
120
|
+
agents_config = [config_data['agent']]
|
|
121
|
+
|
|
122
|
+
if agents_config:
|
|
123
|
+
try:
|
|
124
|
+
from praisonaiagents import Agent
|
|
125
|
+
|
|
126
|
+
for agent_data in agents_config:
|
|
127
|
+
if isinstance(agent_data, dict):
|
|
128
|
+
agent = Agent(
|
|
129
|
+
name=agent_data.get('name', 'Agent'),
|
|
130
|
+
role=agent_data.get('role'),
|
|
131
|
+
instructions=agent_data.get('instructions', agent_data.get('goal', '')),
|
|
132
|
+
llm=agent_data.get('llm'),
|
|
133
|
+
)
|
|
134
|
+
agents.append(agent)
|
|
135
|
+
console.print(f"[green]✓ Loaded agent: {agent.name}[/green]")
|
|
136
|
+
except Exception as e:
|
|
137
|
+
console.print(f"[yellow]Warning: Could not load agents from config: {e}[/yellow]")
|
|
138
|
+
|
|
139
|
+
return agents
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Attach command for PraisonAI CLI.
|
|
3
|
+
|
|
4
|
+
Subscribe to a live session running on the warm local runtime and stream its
|
|
5
|
+
events in real time from another terminal. Multiple clients can attach to the
|
|
6
|
+
same active session and observe it concurrently.
|
|
7
|
+
|
|
8
|
+
praisonai attach <session-id>
|
|
9
|
+
|
|
10
|
+
The runtime must be running (``praisonai daemon start``) and a ``praisonai run``
|
|
11
|
+
must have been issued against the same session id (``run --attach <id>``) for
|
|
12
|
+
events to appear. Attaching is read-only: it never starts execution itself.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json as _json
|
|
16
|
+
|
|
17
|
+
import typer
|
|
18
|
+
|
|
19
|
+
from ..output.console import get_output_controller
|
|
20
|
+
|
|
21
|
+
app = typer.Typer(help="Attach to a live session on the warm runtime")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@app.callback(invoke_without_command=True)
|
|
25
|
+
def attach_main(
|
|
26
|
+
ctx: typer.Context,
|
|
27
|
+
session_id: str = typer.Argument(..., help="Session id to attach to"),
|
|
28
|
+
json_output: bool = typer.Option(False, "--json", help="Emit raw NDJSON events"),
|
|
29
|
+
):
|
|
30
|
+
"""Stream live events for a running session.
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
praisonai attach my-session
|
|
34
|
+
praisonai attach my-session --json
|
|
35
|
+
"""
|
|
36
|
+
if ctx.invoked_subcommand is not None:
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
output = get_output_controller()
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
from praisonai.runtime import (
|
|
43
|
+
get_runtime_descriptor,
|
|
44
|
+
RuntimeClient,
|
|
45
|
+
RuntimeUnavailable,
|
|
46
|
+
)
|
|
47
|
+
except ImportError as e:
|
|
48
|
+
output.print_error(f"Runtime module not available: {e}")
|
|
49
|
+
raise typer.Exit(4)
|
|
50
|
+
|
|
51
|
+
# Require a compatible runtime (same major version) so we never attach to an
|
|
52
|
+
# older runtime that lacks /sessions/{id}/events or speaks a different event
|
|
53
|
+
# contract — mirrors the gate the `run` path uses before reusing a runtime.
|
|
54
|
+
descriptor = get_runtime_descriptor(require_compatible=True)
|
|
55
|
+
if descriptor is None:
|
|
56
|
+
output.print_error(
|
|
57
|
+
"No compatible warm runtime is running. Start one with: praisonai daemon start"
|
|
58
|
+
)
|
|
59
|
+
raise typer.Exit(1)
|
|
60
|
+
|
|
61
|
+
client = RuntimeClient(descriptor)
|
|
62
|
+
|
|
63
|
+
if not json_output:
|
|
64
|
+
output.print_info(f"Attached to session '{session_id}'. Ctrl-C to detach.")
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
for event in client.attach(session_id):
|
|
68
|
+
if json_output:
|
|
69
|
+
print(_json.dumps(event), flush=True)
|
|
70
|
+
continue
|
|
71
|
+
_render_event(output, event)
|
|
72
|
+
except RuntimeUnavailable as e:
|
|
73
|
+
output.print_error(f"Lost connection to runtime: {e}")
|
|
74
|
+
raise typer.Exit(1)
|
|
75
|
+
except KeyboardInterrupt:
|
|
76
|
+
if not json_output:
|
|
77
|
+
output.print_info("Detached.")
|
|
78
|
+
raise typer.Exit(0)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _render_event(output, event: dict) -> None:
|
|
82
|
+
"""Render a single session event for human-readable terminals."""
|
|
83
|
+
etype = event.get("type", "event")
|
|
84
|
+
if etype == "run.start":
|
|
85
|
+
prompt = event.get("prompt", "")
|
|
86
|
+
output.print_info(f"▶ run.start: {prompt}")
|
|
87
|
+
elif etype == "run.result":
|
|
88
|
+
result = event.get("result", "")
|
|
89
|
+
output.print_success("✓ run.result")
|
|
90
|
+
if result:
|
|
91
|
+
print(result)
|
|
92
|
+
elif etype == "run.error":
|
|
93
|
+
output.print_error(f"✗ run.error: {event.get('error', '')}")
|
|
94
|
+
else:
|
|
95
|
+
output.print(_json.dumps(event))
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI command for agent-centric compliance auditing.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
praisonai audit agent-centric --scan /path/to/examples
|
|
6
|
+
praisonai audit agent-centric --fix /path/to/examples
|
|
7
|
+
praisonai audit agent-centric --check /path/to/examples
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import click
|
|
11
|
+
import json
|
|
12
|
+
import sys
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@click.group()
|
|
17
|
+
def audit():
|
|
18
|
+
"""Audit commands for compliance checking."""
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@audit.command("agent-centric")
|
|
23
|
+
@click.option("--scan", "scan_path", type=click.Path(exists=True), help="Scan path for compliance")
|
|
24
|
+
@click.option("--fix", "fix_path", type=click.Path(exists=True), help="Fix non-compliant files")
|
|
25
|
+
@click.option("--check", "check_path", type=click.Path(exists=True), help="Check and fail if non-compliant")
|
|
26
|
+
@click.option("--json", "output_json", is_flag=True, help="Output as JSON")
|
|
27
|
+
@click.option("--line-limit", default=40, help="Line limit for header scan (default: 40)")
|
|
28
|
+
@click.option("--only-examples", is_flag=True, help="Only scan Python examples")
|
|
29
|
+
@click.option("--only-docs", is_flag=True, help="Only scan documentation")
|
|
30
|
+
@click.option("--verbose", "-v", is_flag=True, help="Verbose output")
|
|
31
|
+
def agent_centric(scan_path, fix_path, check_path, output_json, line_limit, only_examples, only_docs, verbose):
|
|
32
|
+
"""
|
|
33
|
+
Audit agent-centric compliance for examples and docs.
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
praisonai audit agent-centric --scan ./examples
|
|
37
|
+
praisonai audit agent-centric --fix ./examples --verbose
|
|
38
|
+
praisonai audit agent-centric --check ./examples # Fails if non-compliant
|
|
39
|
+
"""
|
|
40
|
+
from praisonai.audit.agent_centric import AgentCentricAuditor, ComplianceStatus
|
|
41
|
+
|
|
42
|
+
path = scan_path or fix_path or check_path
|
|
43
|
+
if not path:
|
|
44
|
+
click.echo("Error: Must specify --scan, --fix, or --check with a path", err=True)
|
|
45
|
+
sys.exit(1)
|
|
46
|
+
|
|
47
|
+
auditor = AgentCentricAuditor(line_limit=line_limit, verbose=verbose)
|
|
48
|
+
|
|
49
|
+
if fix_path:
|
|
50
|
+
# Fix mode
|
|
51
|
+
click.echo(f"Fixing non-compliant files in: {fix_path}")
|
|
52
|
+
report = auditor.scan(fix_path)
|
|
53
|
+
|
|
54
|
+
fixed_count = 0
|
|
55
|
+
for result in report.results:
|
|
56
|
+
if result.status == ComplianceStatus.NON_COMPLIANT:
|
|
57
|
+
success, reason = auditor.fix_file(result.file_path)
|
|
58
|
+
if success:
|
|
59
|
+
fixed_count += 1
|
|
60
|
+
if verbose:
|
|
61
|
+
click.echo(f" Fixed: {result.file_path} - {reason}")
|
|
62
|
+
|
|
63
|
+
click.echo(f"\nFixed {fixed_count} files")
|
|
64
|
+
|
|
65
|
+
# Re-scan to verify
|
|
66
|
+
report = auditor.scan(fix_path)
|
|
67
|
+
click.echo(f"Compliance rate: {report.compliance_rate():.1f}%")
|
|
68
|
+
|
|
69
|
+
else:
|
|
70
|
+
# Scan or check mode
|
|
71
|
+
report = auditor.scan(path)
|
|
72
|
+
|
|
73
|
+
if output_json:
|
|
74
|
+
click.echo(auditor.to_json(report))
|
|
75
|
+
else:
|
|
76
|
+
click.echo(f"\n{'='*60}")
|
|
77
|
+
click.echo("AGENT-CENTRIC COMPLIANCE REPORT")
|
|
78
|
+
click.echo(f"{'='*60}")
|
|
79
|
+
click.echo(f"Total files: {report.total_files}")
|
|
80
|
+
click.echo(f"Compliant: {report.compliant}")
|
|
81
|
+
click.echo(f"Non-compliant: {report.non_compliant}")
|
|
82
|
+
click.echo(f"Skipped: {report.skipped}")
|
|
83
|
+
click.echo(f"Compliance rate: {report.compliance_rate():.1f}%")
|
|
84
|
+
|
|
85
|
+
if report.by_reason:
|
|
86
|
+
click.echo(f"\nBy Reason:")
|
|
87
|
+
for reason, count in sorted(report.by_reason.items()):
|
|
88
|
+
click.echo(f" {reason}: {count}")
|
|
89
|
+
|
|
90
|
+
if verbose and report.non_compliant > 0:
|
|
91
|
+
click.echo(f"\nNon-compliant files:")
|
|
92
|
+
for r in report.results:
|
|
93
|
+
if r.status == ComplianceStatus.NON_COMPLIANT:
|
|
94
|
+
click.echo(f" {r.file_path}")
|
|
95
|
+
click.echo(f" Reason: {r.reason.value if r.reason else 'unknown'}")
|
|
96
|
+
|
|
97
|
+
# Check mode - fail if non-compliant
|
|
98
|
+
if check_path and report.non_compliant > 0:
|
|
99
|
+
click.echo(f"\n❌ FAILED: {report.non_compliant} non-compliant files found", err=True)
|
|
100
|
+
sys.exit(1)
|
|
101
|
+
elif check_path:
|
|
102
|
+
click.echo(f"\n✓ PASSED: All files are agent-centric compliant")
|