PraisonAI 4.7.11__tar.gz → 4.7.13__tar.gz
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-4.7.11 → praisonai-4.7.13}/PKG-INFO +10 -10
- {praisonai-4.7.11 → praisonai-4.7.13}/PraisonAI.egg-info/PKG-INFO +10 -10
- {praisonai-4.7.11 → praisonai-4.7.13}/PraisonAI.egg-info/SOURCES.txt +1 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/PraisonAI.egg-info/requires.txt +9 -9
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_api_auth.py +7 -3
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_async_bridge.py +31 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_entrypoint.py +10 -14
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/acp/session.py +55 -12
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/agents_generator.py +107 -6
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/api/agent_invoke.py +5 -1
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/api/call.py +66 -26
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/app/agentos.py +2 -16
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/auto.py +20 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/__init__.py +12 -0
- praisonai-4.7.13/praisonai/capabilities/decisions.py +31 -0
- praisonai-4.7.13/praisonai/capabilities/guardrails.py +192 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/managed.py +4 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/schedule.py +1 -1
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/standardise.py +3 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/agent_scheduler.py +26 -9
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/background.py +6 -4
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/sandbox_cli.py +38 -29
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/direct_prompt.py +2 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/interactive_legacy.py +5 -3
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/db/adapter.py +226 -64
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/autogen_adapter.py +46 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/praisonai_adapter.py +31 -1
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/registry.py +55 -24
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/inbuilt_tools/__init__.py +6 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/inbuilt_tools/autogen_tools.py +4 -4
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/__init__.py +8 -1
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute_managed_agent.py +108 -18
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/registry.py +8 -3
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/__init__.py +7 -5
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/_valkey_client.py +3 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/json_store.py +57 -14
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/__init__.py +3 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/base.py +105 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/orchestrator.py +57 -10
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/__init__.py +4 -3
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/base.py +98 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/serve.py +146 -29
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/_base_scheduler.py +25 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/async_agent_scheduler.py +3 -22
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/daemon_manager.py +35 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/run_policy.py +13 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/state_manager.py +87 -17
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/security/__init__.py +2 -2
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tools/multiedit.py +117 -32
- praisonai-4.7.13/praisonai/version.py +1 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/pyproject.toml +9 -9
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_serve_features.py +40 -1
- praisonai-4.7.11/praisonai/capabilities/guardrails.py +0 -186
- praisonai-4.7.11/praisonai/version.py +0 -1
- {praisonai-4.7.11 → praisonai-4.7.13}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/README.md +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/__main__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_lazy_cache.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_logging.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/acp/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/acp/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/app/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/_shim.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/branding.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/_profiling.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/interactive/async_tui.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/interactive/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/interactive/events.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/legacy/workflow_commands.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/main.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/config/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/config/agents.schema.json +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/config/schema.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/config/validator.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/history_store.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/queue.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/setup.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/db/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/flow/client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/flow/converter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/_config_builder.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/framework_adapters/workflow_framework.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/inc/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/inc/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/bridges/schedules_runner.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integration/pages/workflow_runs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/_cli_loaders.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/_managed_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/_sync_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/compute/tenki.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/jobs/executor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/jobs/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/jobs/router.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/jobs/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/jobs/store.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/llm/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/llm/env.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/llm/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/n8n/client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/observability/hooks.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/_ops.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/profiler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/push/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/push/client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/push/transports.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/core.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/history.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/security.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/recipe/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/applier.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/judge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/plan.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/player.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/reader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/storage.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/replay/writer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/_delivery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/security/audit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/security/injection.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/security/protected.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/setup/build.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/setup.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/_tool_sources.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/cache.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/security.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tool_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tools/audio.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/train/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/train.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/train_vision.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui/context.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_dashboard/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/praisonai/upload_vision.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/setup.cfg +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_approval_system.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_basic.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_cli_features.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_runner.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.13}/tests/test_sandboxed_agent_compatibility.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 4.7.
|
|
3
|
+
Version: 4.7.13
|
|
4
4
|
Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -11,14 +11,14 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
Requires-Dist: rich>=13.7
|
|
12
12
|
Requires-Dist: markdown>=3.5
|
|
13
13
|
Requires-Dist: pyparsing>=3.0.0
|
|
14
|
-
Requires-Dist: praisonaiagents>=1.7.
|
|
15
|
-
Requires-Dist: praisonai-code>=0.1.
|
|
16
|
-
Requires-Dist: praisonai-bot>=0.1.
|
|
17
|
-
Requires-Dist: praisonai-train>=0.1.
|
|
18
|
-
Requires-Dist: praisonai-browser>=0.1.
|
|
19
|
-
Requires-Dist: praisonai-mcp>=0.1.
|
|
20
|
-
Requires-Dist: praisonai-sandbox>=0.1.
|
|
21
|
-
Requires-Dist: praisonai-deploy>=0.1.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.7.11
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.10
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.10
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.10
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.10
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.12
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.10
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.10
|
|
22
22
|
Requires-Dist: python-dotenv>=0.19.0
|
|
23
23
|
Requires-Dist: litellm<2,>=1.83.14
|
|
24
24
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -182,7 +182,7 @@ Requires-Dist: psycopg2-binary>=2.9.0; extra == "postgresql"
|
|
|
182
182
|
Provides-Extra: dynamodb
|
|
183
183
|
Requires-Dist: boto3>=1.35.0; extra == "dynamodb"
|
|
184
184
|
Provides-Extra: valkey
|
|
185
|
-
Requires-Dist: valkey-glide-sync>=2.
|
|
185
|
+
Requires-Dist: valkey-glide-sync>=2.5.2; extra == "valkey"
|
|
186
186
|
Provides-Extra: neon
|
|
187
187
|
Requires-Dist: psycopg2-binary>=2.9.0; extra == "neon"
|
|
188
188
|
Provides-Extra: turso
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 4.7.
|
|
3
|
+
Version: 4.7.13
|
|
4
4
|
Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -11,14 +11,14 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
Requires-Dist: rich>=13.7
|
|
12
12
|
Requires-Dist: markdown>=3.5
|
|
13
13
|
Requires-Dist: pyparsing>=3.0.0
|
|
14
|
-
Requires-Dist: praisonaiagents>=1.7.
|
|
15
|
-
Requires-Dist: praisonai-code>=0.1.
|
|
16
|
-
Requires-Dist: praisonai-bot>=0.1.
|
|
17
|
-
Requires-Dist: praisonai-train>=0.1.
|
|
18
|
-
Requires-Dist: praisonai-browser>=0.1.
|
|
19
|
-
Requires-Dist: praisonai-mcp>=0.1.
|
|
20
|
-
Requires-Dist: praisonai-sandbox>=0.1.
|
|
21
|
-
Requires-Dist: praisonai-deploy>=0.1.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.7.11
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.10
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.10
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.10
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.10
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.12
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.10
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.10
|
|
22
22
|
Requires-Dist: python-dotenv>=0.19.0
|
|
23
23
|
Requires-Dist: litellm<2,>=1.83.14
|
|
24
24
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -182,7 +182,7 @@ Requires-Dist: psycopg2-binary>=2.9.0; extra == "postgresql"
|
|
|
182
182
|
Provides-Extra: dynamodb
|
|
183
183
|
Requires-Dist: boto3>=1.35.0; extra == "dynamodb"
|
|
184
184
|
Provides-Extra: valkey
|
|
185
|
-
Requires-Dist: valkey-glide-sync>=2.
|
|
185
|
+
Requires-Dist: valkey-glide-sync>=2.5.2; extra == "valkey"
|
|
186
186
|
Provides-Extra: neon
|
|
187
187
|
Requires-Dist: psycopg2-binary>=2.9.0; extra == "neon"
|
|
188
188
|
Provides-Extra: turso
|
|
@@ -59,6 +59,7 @@ praisonai/capabilities/batches.py
|
|
|
59
59
|
praisonai/capabilities/completions.py
|
|
60
60
|
praisonai/capabilities/container_files.py
|
|
61
61
|
praisonai/capabilities/containers.py
|
|
62
|
+
praisonai/capabilities/decisions.py
|
|
62
63
|
praisonai/capabilities/embeddings.py
|
|
63
64
|
praisonai/capabilities/files.py
|
|
64
65
|
praisonai/capabilities/fine_tuning.py
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
rich>=13.7
|
|
2
2
|
markdown>=3.5
|
|
3
3
|
pyparsing>=3.0.0
|
|
4
|
-
praisonaiagents>=1.7.
|
|
5
|
-
praisonai-code>=0.1.
|
|
6
|
-
praisonai-bot>=0.1.
|
|
7
|
-
praisonai-train>=0.1.
|
|
8
|
-
praisonai-browser>=0.1.
|
|
9
|
-
praisonai-mcp>=0.1.
|
|
10
|
-
praisonai-sandbox>=0.1.
|
|
11
|
-
praisonai-deploy>=0.1.
|
|
4
|
+
praisonaiagents>=1.7.11
|
|
5
|
+
praisonai-code>=0.1.10
|
|
6
|
+
praisonai-bot>=0.1.10
|
|
7
|
+
praisonai-train>=0.1.10
|
|
8
|
+
praisonai-browser>=0.1.10
|
|
9
|
+
praisonai-mcp>=0.1.12
|
|
10
|
+
praisonai-sandbox>=0.1.10
|
|
11
|
+
praisonai-deploy>=0.1.10
|
|
12
12
|
python-dotenv>=0.19.0
|
|
13
13
|
litellm<2,>=1.83.14
|
|
14
14
|
PyYAML>=6.0
|
|
@@ -249,7 +249,7 @@ libsql-experimental>=0.0.50
|
|
|
249
249
|
aiui<0.4,>=0.3.121
|
|
250
250
|
|
|
251
251
|
[valkey]
|
|
252
|
-
valkey-glide-sync>=2.
|
|
252
|
+
valkey-glide-sync>=2.5.2
|
|
253
253
|
|
|
254
254
|
[xata]
|
|
255
255
|
psycopg2-binary>=2.9.0
|
|
@@ -15,8 +15,11 @@ def build_api_key_middleware(api_key: str, public_paths: Optional[Iterable[str]]
|
|
|
15
15
|
api_key: The expected API key; requests must present it via a
|
|
16
16
|
``Bearer`` ``Authorization`` header or ``X-API-Key`` header.
|
|
17
17
|
public_paths: Paths that bypass authentication. Any request whose path
|
|
18
|
-
is in this set, or
|
|
19
|
-
through without a
|
|
18
|
+
is in this set, or is exactly ``/__praisonai__/discovery`` (the
|
|
19
|
+
unauthenticated capability document), is allowed through without a
|
|
20
|
+
token. The discovery path is matched exactly -- never by prefix --
|
|
21
|
+
so a server whose ``api_prefix`` happens to sit under
|
|
22
|
+
``/__praisonai__`` does not silently expose its routes.
|
|
20
23
|
|
|
21
24
|
Imports of ``hmac``/``starlette`` are kept inside this function so callers
|
|
22
25
|
stay lazy-import friendly.
|
|
@@ -26,11 +29,12 @@ def build_api_key_middleware(api_key: str, public_paths: Optional[Iterable[str]]
|
|
|
26
29
|
from starlette.responses import JSONResponse
|
|
27
30
|
|
|
28
31
|
public = set(public_paths or ())
|
|
32
|
+
public.add("/__praisonai__/discovery")
|
|
29
33
|
|
|
30
34
|
class _APIKeyMiddleware(BaseHTTPMiddleware):
|
|
31
35
|
async def dispatch(self, request, call_next):
|
|
32
36
|
path = request.url.path
|
|
33
|
-
if path in public
|
|
37
|
+
if path in public:
|
|
34
38
|
return await call_next(request)
|
|
35
39
|
auth = request.headers.get("Authorization", "")
|
|
36
40
|
header_key = request.headers.get("X-API-Key", "")
|
|
@@ -384,6 +384,37 @@ def run_sync(coro: Awaitable[T], *, timeout: "float | None | _Unset" = _UNSET) -
|
|
|
384
384
|
return _default_bridge().run_sync(coro, timeout=timeout)
|
|
385
385
|
|
|
386
386
|
|
|
387
|
+
def run_cli_coro(coro: Awaitable[T], *, timeout: "float | None | _Unset" = None) -> T:
|
|
388
|
+
"""Preferred entry point for CLI subcommands running a coroutine.
|
|
389
|
+
|
|
390
|
+
Routes through the shared :class:`AsyncBridge` (via :func:`run_sync`) so
|
|
391
|
+
per-loop connection pools survive across calls, any embedder-installed
|
|
392
|
+
``scoped_bridge()`` is honoured, and a fresh event loop is NOT spawned on
|
|
393
|
+
every invocation. This replaces bare ``asyncio.run(...)`` at CLI leaves,
|
|
394
|
+
which tears down the loop each call and breaks per-loop cached clients
|
|
395
|
+
(e.g. ``httpx.AsyncClient``) with ``RuntimeError: Event loop is closed``.
|
|
396
|
+
|
|
397
|
+
Timeout defaults to ``None`` (**unbounded**) to preserve the prior
|
|
398
|
+
``asyncio.run(...)`` semantics these leaves replaced: CLI commands own their
|
|
399
|
+
own runtime (an interactive sandbox shell, a multi-artifact ``standardise``
|
|
400
|
+
run, or a long background job must not be aborted by the 300s ``run_sync``
|
|
401
|
+
default). Callers that want a deadline pass an explicit ``timeout=``.
|
|
402
|
+
|
|
403
|
+
Sync context -> :func:`run_sync` on the shared background loop.
|
|
404
|
+
Async context -> ``RuntimeError``; the caller must ``await coro`` directly.
|
|
405
|
+
"""
|
|
406
|
+
try:
|
|
407
|
+
asyncio.get_running_loop()
|
|
408
|
+
except RuntimeError:
|
|
409
|
+
return run_sync(coro, timeout=timeout)
|
|
410
|
+
with contextlib.suppress(Exception):
|
|
411
|
+
coro.close() # type: ignore[attr-defined]
|
|
412
|
+
raise RuntimeError(
|
|
413
|
+
"run_cli_coro() cannot be called from within a running event loop; "
|
|
414
|
+
"await the coroutine directly instead."
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
|
|
387
418
|
def run_sync_or_offload(
|
|
388
419
|
coro: Awaitable[T],
|
|
389
420
|
*,
|
|
@@ -100,14 +100,9 @@ def run(agent_file: str,
|
|
|
100
100
|
"""
|
|
101
101
|
from .agents_generator import AgentsGenerator
|
|
102
102
|
|
|
103
|
-
#
|
|
104
|
-
#
|
|
105
|
-
#
|
|
106
|
-
# absent: a custom adapter already registered under a built-in name (e.g. a
|
|
107
|
-
# multi-tenant host's own `fusion`) is preserved, never overwritten.
|
|
108
|
-
from .adapters import register_default_adapters
|
|
109
|
-
register_default_adapters()
|
|
110
|
-
|
|
103
|
+
# Adapter wiring (readers/retrievers/rerankers) is single-sourced in
|
|
104
|
+
# AgentsGenerator.__init__ so every launch path (CLI, serve, eval, Python)
|
|
105
|
+
# is covered identically.
|
|
111
106
|
adapter, config_list = _resolve_run_inputs(framework)
|
|
112
107
|
_apply_model_override(config_list, kwargs)
|
|
113
108
|
cli_config = _merge_cli_config(cli_config, kwargs)
|
|
@@ -142,11 +137,11 @@ async def arun(agent_file: str,
|
|
|
142
137
|
|
|
143
138
|
from .agents_generator import AgentsGenerator
|
|
144
139
|
|
|
145
|
-
#
|
|
146
|
-
#
|
|
147
|
-
# registration
|
|
148
|
-
#
|
|
149
|
-
#
|
|
140
|
+
# Adapter wiring (readers/retrievers/rerankers) is single-sourced in
|
|
141
|
+
# AgentsGenerator.__init__. Pre-warm it off the caller's event loop here so
|
|
142
|
+
# the (lazy-import) registration does not run on the loop when the generator
|
|
143
|
+
# is constructed synchronously below. Idempotent: __init__ then hits the fast
|
|
144
|
+
# path. Every launch path is covered identically via __init__.
|
|
150
145
|
from .adapters import register_default_adapters
|
|
151
146
|
await asyncio.to_thread(register_default_adapters)
|
|
152
147
|
|
|
@@ -159,7 +154,8 @@ async def arun(agent_file: str,
|
|
|
159
154
|
|
|
160
155
|
# Own the generator's lifecycle so its lazily-allocated tool-timeout
|
|
161
156
|
# executor is released once the single run completes, instead of leaking
|
|
162
|
-
# daemon threads per call in long-lived async server workers.
|
|
157
|
+
# daemon threads per call in long-lived async server workers. Adapter wiring
|
|
158
|
+
# was pre-warmed above, so __init__ hits the fast path without blocking loop.
|
|
163
159
|
with AgentsGenerator(
|
|
164
160
|
agent_file=agent_file,
|
|
165
161
|
framework=adapter.name,
|
|
@@ -6,6 +6,9 @@ Handles session creation, persistence, and resume functionality.
|
|
|
6
6
|
|
|
7
7
|
import json
|
|
8
8
|
import logging
|
|
9
|
+
import os
|
|
10
|
+
import re
|
|
11
|
+
import tempfile
|
|
9
12
|
import time
|
|
10
13
|
import uuid
|
|
11
14
|
from dataclasses import dataclass, field
|
|
@@ -14,6 +17,23 @@ from typing import Any, Dict, List, Optional
|
|
|
14
17
|
|
|
15
18
|
logger = logging.getLogger(__name__)
|
|
16
19
|
|
|
20
|
+
# Matches the ids minted by ``ACPSession.create`` (``sess_`` + 16 hex chars).
|
|
21
|
+
# Allowing up to 32 hex chars keeps forward-compat if the id width grows.
|
|
22
|
+
_SESSION_ID_RE = re.compile(r"^sess_[0-9a-f]{1,32}$")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _validate_session_id(session_id: str) -> str:
|
|
26
|
+
"""Reject anything that is not a server-minted session id.
|
|
27
|
+
|
|
28
|
+
``session_id`` arrives over JSON-RPC from an external peer and is
|
|
29
|
+
interpolated into a filesystem path, so an unvalidated value like
|
|
30
|
+
``"../../tmp/secret"`` would let the peer read or delete arbitrary
|
|
31
|
+
``*.json`` files. Only ids matching the ``create()`` format are allowed.
|
|
32
|
+
"""
|
|
33
|
+
if not isinstance(session_id, str) or not _SESSION_ID_RE.match(session_id):
|
|
34
|
+
raise ValueError(f"invalid session_id: {session_id!r}")
|
|
35
|
+
return session_id
|
|
36
|
+
|
|
17
37
|
|
|
18
38
|
@dataclass
|
|
19
39
|
class ACPSession:
|
|
@@ -124,23 +144,46 @@ class SessionStore:
|
|
|
124
144
|
self._last_session_file = self.storage_dir / ".last_session"
|
|
125
145
|
|
|
126
146
|
def _session_path(self, session_id: str) -> Path:
|
|
127
|
-
"""Get path for session file."""
|
|
128
|
-
|
|
129
|
-
|
|
147
|
+
"""Get path for session file (validated against traversal)."""
|
|
148
|
+
_validate_session_id(session_id)
|
|
149
|
+
# ``resolve`` anchors the path so a future id-format change can't
|
|
150
|
+
# silently re-open the traversal hole.
|
|
151
|
+
return (self.storage_dir / f"{session_id}.json").resolve()
|
|
152
|
+
|
|
153
|
+
@staticmethod
|
|
154
|
+
def _atomic_write(path: Path, text: str) -> None:
|
|
155
|
+
"""Write ``text`` to ``path`` atomically via a temp file + os.replace.
|
|
156
|
+
|
|
157
|
+
A crash or Ctrl-C mid-write can never leave the target empty or
|
|
158
|
+
half-written — the old content survives until the rename succeeds.
|
|
159
|
+
"""
|
|
160
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
161
|
+
fd, tmp = tempfile.mkstemp(prefix=".sess-", suffix=".tmp", dir=str(path.parent))
|
|
162
|
+
try:
|
|
163
|
+
with os.fdopen(fd, "w") as f:
|
|
164
|
+
f.write(text)
|
|
165
|
+
f.flush()
|
|
166
|
+
os.fsync(f.fileno())
|
|
167
|
+
os.replace(tmp, path)
|
|
168
|
+
except BaseException:
|
|
169
|
+
try:
|
|
170
|
+
os.unlink(tmp)
|
|
171
|
+
except OSError:
|
|
172
|
+
pass
|
|
173
|
+
raise
|
|
174
|
+
|
|
130
175
|
def save(self, session: ACPSession) -> None:
|
|
131
|
-
"""Save session to disk."""
|
|
176
|
+
"""Save session to disk atomically."""
|
|
132
177
|
try:
|
|
133
178
|
path = self._session_path(session.session_id)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
f.write(session.session_id)
|
|
140
|
-
|
|
179
|
+
self._atomic_write(path, json.dumps(session.to_dict(), indent=2))
|
|
180
|
+
|
|
181
|
+
# Update last session pointer ONLY after the payload is durable.
|
|
182
|
+
self._atomic_write(self._last_session_file, session.session_id)
|
|
183
|
+
|
|
141
184
|
logger.debug(f"Saved session {session.session_id}")
|
|
142
185
|
except Exception as e:
|
|
143
|
-
logger.error(f"Failed to save session: {e}")
|
|
186
|
+
logger.error(f"Failed to save session {session.session_id}: {e}")
|
|
144
187
|
|
|
145
188
|
def load(self, session_id: str) -> Optional[ACPSession]:
|
|
146
189
|
"""Load session from disk."""
|
|
@@ -373,7 +373,7 @@ def _make_timeout_proxy(inner, wrapped_run=None, wrapped__run=None):
|
|
|
373
373
|
return proxy
|
|
374
374
|
|
|
375
375
|
|
|
376
|
-
def _wrap_with_timeout(tool, timeout_seconds: float, executor_factory, on_leaked=None, owner_key=None):
|
|
376
|
+
def _wrap_with_timeout(tool, timeout_seconds: float, executor_factory, on_leaked=None, owner_key=None, native_delegates_to_core=False):
|
|
377
377
|
"""Enforce a per-call timeout on a tool, sync or async.
|
|
378
378
|
|
|
379
379
|
For async tools the underlying task is cancelled on timeout. For sync tools
|
|
@@ -387,10 +387,33 @@ def _wrap_with_timeout(tool, timeout_seconds: float, executor_factory, on_leaked
|
|
|
387
387
|
On timeout the wrapper raises :class:`ToolTimeoutError` rather than returning
|
|
388
388
|
a JSON string, so a tool's declared return-type contract is never silently
|
|
389
389
|
downgraded; the framework adapter decides how to surface the timeout.
|
|
390
|
+
|
|
391
|
+
``native_delegates_to_core``: when True, a *plain native callable* (not a
|
|
392
|
+
framework tool object) is returned unwrapped so core's own per-tool timeout
|
|
393
|
+
enforcement (``praisonaiagents`` ``agent/tool_execution.py`` /
|
|
394
|
+
``tools/call_executor.py``, configured via the agent's ``tool_config``
|
|
395
|
+
timeout) owns it — avoiding a second, duplicated abandon-on-timeout thread
|
|
396
|
+
pool for tools that already flow through core (#5650). Framework tool
|
|
397
|
+
objects (CrewAI/AutoGen/LangChain ``BaseTool``) never reach core's executor,
|
|
398
|
+
so they are *always* wrapped here to preserve their ``args_schema``.
|
|
390
399
|
"""
|
|
391
400
|
if timeout_seconds is None or timeout_seconds <= 0:
|
|
392
401
|
return tool
|
|
393
402
|
|
|
403
|
+
# praisonai-native path: a plain callable already flows through core's tool
|
|
404
|
+
# executor, which enforces the resolved per-tool timeout. Returning it
|
|
405
|
+
# unwrapped lets core own the abandon-on-expiry semantics instead of the
|
|
406
|
+
# wrapper standing up a second thread pool with the same behaviour. Only
|
|
407
|
+
# framework tool objects (which bypass core) still need wrapper wrapping, so
|
|
408
|
+
# they fall through to the logic below.
|
|
409
|
+
if (
|
|
410
|
+
native_delegates_to_core
|
|
411
|
+
and callable(tool)
|
|
412
|
+
and not isinstance(tool, type)
|
|
413
|
+
and not _looks_like_framework_tool(tool)
|
|
414
|
+
):
|
|
415
|
+
return tool
|
|
416
|
+
|
|
394
417
|
import asyncio
|
|
395
418
|
import concurrent.futures
|
|
396
419
|
import functools
|
|
@@ -599,6 +622,15 @@ class AgentsGenerator:
|
|
|
599
622
|
task_callback (callable, optional): A callback function to be executed after each tool run.
|
|
600
623
|
tools (dict): A dictionary containing the tools to be used for the agents.
|
|
601
624
|
"""
|
|
625
|
+
# Wire the built-in readers/retrievers/rerankers into the core-SDK
|
|
626
|
+
# registries so YAML `retriever:` / `reader:` / `reranker:` declarations
|
|
627
|
+
# resolve identically on every launch path (CLI, serve, eval, Python).
|
|
628
|
+
# Single-sourced here so surfaces that construct AgentsGenerator directly
|
|
629
|
+
# (praisonai <file.yaml>, serve, eval) get the same wiring as run()/arun().
|
|
630
|
+
# Idempotent + thread-safe + register-only-if-absent; safe to call again.
|
|
631
|
+
from .adapters import register_default_adapters
|
|
632
|
+
register_default_adapters()
|
|
633
|
+
|
|
602
634
|
self.agent_file = agent_file
|
|
603
635
|
self.framework = framework
|
|
604
636
|
self.config_list = config_list
|
|
@@ -766,14 +798,31 @@ class AgentsGenerator:
|
|
|
766
798
|
with self._tool_timeout_executor_lock:
|
|
767
799
|
self._leaked_workers += 1
|
|
768
800
|
|
|
769
|
-
def _wrap_tool_with_timeout(self, tool, timeout_seconds):
|
|
770
|
-
"""Wrap a tool with this generator's instance-owned timeout executor.
|
|
801
|
+
def _wrap_tool_with_timeout(self, tool, timeout_seconds, native_delegates_to_core=None):
|
|
802
|
+
"""Wrap a tool with this generator's instance-owned timeout executor.
|
|
803
|
+
|
|
804
|
+
On the praisonai-native framework the resolved per-tool timeout is
|
|
805
|
+
enforced by core (``praisonaiagents`` ``agent/tool_execution.py``, wired
|
|
806
|
+
via the agent's ``tool_config`` timeout), so a *native* callable is left
|
|
807
|
+
unwrapped here instead of being bound to a second wrapper-owned thread
|
|
808
|
+
pool with the same abandon-on-expiry semantics (#5650). Framework tool
|
|
809
|
+
objects (CrewAI/AutoGen/LangChain ``BaseTool``) bypass core, so they are
|
|
810
|
+
still wrapped.
|
|
811
|
+
|
|
812
|
+
``native_delegates_to_core``: callers that already know the resolved
|
|
813
|
+
framework (the per-run wrap/resolver closures) pass it explicitly;
|
|
814
|
+
otherwise it is inferred from ``self.framework`` (resolved to the chosen
|
|
815
|
+
adapter name by the time an adapter invokes a wrap closure at run time).
|
|
816
|
+
"""
|
|
817
|
+
if native_delegates_to_core is None:
|
|
818
|
+
native_delegates_to_core = (getattr(self, "framework", None) or "") == "praisonai"
|
|
771
819
|
return _wrap_with_timeout(
|
|
772
820
|
tool,
|
|
773
821
|
timeout_seconds,
|
|
774
822
|
self._get_tool_timeout_executor,
|
|
775
823
|
on_leaked=self._note_leaked_worker,
|
|
776
824
|
owner_key=self._timeout_owner_key,
|
|
825
|
+
native_delegates_to_core=native_delegates_to_core,
|
|
777
826
|
)
|
|
778
827
|
|
|
779
828
|
def close(self):
|
|
@@ -964,9 +1013,23 @@ class AgentsGenerator:
|
|
|
964
1013
|
# Canonical format conversion: 'agents' -> 'roles', 'instructions' -> 'backstory'
|
|
965
1014
|
# Treat an empty ``roles: {}`` the same as a missing one so populated
|
|
966
1015
|
# ``agents:`` is still promoted instead of running with zero agents.
|
|
967
|
-
|
|
968
|
-
|
|
1016
|
+
#
|
|
1017
|
+
# Promotion is *authoritative*: the shorthand ``agents:`` bucket is
|
|
1018
|
+
# removed after merging into ``roles:`` so downstream validators and the
|
|
1019
|
+
# executor read a single source of truth. Leaving ``agents:`` in place
|
|
1020
|
+
# let validators see a merged ``{**roles, **agents}`` view the executor
|
|
1021
|
+
# (which reads only ``roles:``) never runs — causing double-fired
|
|
1022
|
+
# warnings, false-positive validation rejections, and silently dropped
|
|
1023
|
+
# ``tool_timeout``/handoff knobs for agents that never became roles.
|
|
1024
|
+
if 'agents' in config and isinstance(config['agents'], dict):
|
|
1025
|
+
config.setdefault('roles', {})
|
|
1026
|
+
if not isinstance(config['roles'], dict):
|
|
1027
|
+
config['roles'] = {}
|
|
969
1028
|
for agent_name, agent_config in config['agents'].items():
|
|
1029
|
+
# An entry already present under ``roles:`` is canonical and
|
|
1030
|
+
# wins; only agents-only entries are promoted.
|
|
1031
|
+
if agent_name in config['roles']:
|
|
1032
|
+
continue
|
|
970
1033
|
role_config = dict(agent_config) if agent_config else {}
|
|
971
1034
|
# Convert 'instructions' to 'backstory' if present
|
|
972
1035
|
if 'instructions' in role_config and 'backstory' not in role_config:
|
|
@@ -979,6 +1042,8 @@ class AgentsGenerator:
|
|
|
979
1042
|
if 'backstory' not in role_config:
|
|
980
1043
|
role_config['backstory'] = f'You are a {role_config["role"]}'
|
|
981
1044
|
config['roles'][agent_name] = role_config
|
|
1045
|
+
# Drop the shorthand bucket so validators and the executor agree.
|
|
1046
|
+
del config['agents']
|
|
982
1047
|
|
|
983
1048
|
# Get workflow input: 'input' is canonical, 'topic' is alias for backward compatibility
|
|
984
1049
|
topic = config.get('input', config.get('topic', ''))
|
|
@@ -1055,11 +1120,35 @@ class AgentsGenerator:
|
|
|
1055
1120
|
# that when the *same* generator instance is reused with a different
|
|
1056
1121
|
# timeout layout, a stale closure from a previous run can never leak into
|
|
1057
1122
|
# the adapters and apply the wrong budget to the current run.
|
|
1123
|
+
# Resolve the chosen framework now (the same registry resolution the
|
|
1124
|
+
# run prep uses) so native-vs-framework tool handling is decided BEFORE
|
|
1125
|
+
# the uniform wrap is applied eagerly below — ``self.framework`` is not
|
|
1126
|
+
# yet updated to the resolved adapter name at this point in the run.
|
|
1127
|
+
_requested_framework = getattr(self, "framework", None) or config.get('framework')
|
|
1128
|
+
registry = getattr(self, "_adapter_registry", None)
|
|
1129
|
+
try:
|
|
1130
|
+
resolved_framework = (
|
|
1131
|
+
registry.resolve_or_default(_requested_framework)
|
|
1132
|
+
if registry is not None else _requested_framework
|
|
1133
|
+
)
|
|
1134
|
+
except Exception:
|
|
1135
|
+
resolved_framework = _requested_framework
|
|
1136
|
+
native = resolved_framework == "praisonai"
|
|
1137
|
+
|
|
1058
1138
|
uniform = self._resolve_uniform_tool_timeout(config)
|
|
1059
1139
|
wrap = None
|
|
1060
1140
|
resolver = None
|
|
1061
1141
|
if uniform and uniform > 0:
|
|
1062
|
-
|
|
1142
|
+
# On the native framework a *plain callable* is left unwrapped so
|
|
1143
|
+
# core enforces the budget (#5650) — the raw value is exposed below
|
|
1144
|
+
# so the native adapter configures each agent's tool_config timeout.
|
|
1145
|
+
# Framework tool *objects* are still wrapped here regardless, so
|
|
1146
|
+
# their args_schema survives for the LLM. ``native`` is passed
|
|
1147
|
+
# explicitly because ``self.framework`` is not yet resolved here.
|
|
1148
|
+
wrap = (
|
|
1149
|
+
lambda t, _sec=uniform, _n=native:
|
|
1150
|
+
self._wrap_tool_with_timeout(t, _sec, native_delegates_to_core=_n)
|
|
1151
|
+
)
|
|
1063
1152
|
tools_dict = {name: wrap(tool) for name, tool in tools_dict.items()}
|
|
1064
1153
|
else:
|
|
1065
1154
|
# No single uniform timeout. If any agent declared a per-agent
|
|
@@ -1080,9 +1169,21 @@ class AgentsGenerator:
|
|
|
1080
1169
|
# so adapters still read them via the same keys. Both are written every
|
|
1081
1170
|
# time so the inactive path is cleared rather than left holding a prior
|
|
1082
1171
|
# closure.
|
|
1172
|
+
# On the native framework, plain callables are no longer wrapped by the
|
|
1173
|
+
# wrapper's own executor (above) — core enforces the timeout instead
|
|
1174
|
+
# (#5650). Expose the resolved per-agent timeout (float seconds) so the
|
|
1175
|
+
# native adapter can configure each core Agent's ``tool_config`` timeout.
|
|
1176
|
+
# ``None`` for non-native frameworks, which keep wrapper-side wrapping.
|
|
1177
|
+
native_tool_timeout_resolver = None
|
|
1178
|
+
if native:
|
|
1179
|
+
native_tool_timeout_resolver = (
|
|
1180
|
+
lambda agent_key, _cfg=config: self.resolve_agent_tool_timeout(agent_key, _cfg)
|
|
1181
|
+
)
|
|
1182
|
+
|
|
1083
1183
|
self._run_ctx = {
|
|
1084
1184
|
"_tool_timeout_wrap": wrap,
|
|
1085
1185
|
"_agent_tool_wrap_resolver": resolver,
|
|
1186
|
+
"_native_tool_timeout_resolver": native_tool_timeout_resolver,
|
|
1086
1187
|
}
|
|
1087
1188
|
return tools_dict
|
|
1088
1189
|
|
|
@@ -697,7 +697,11 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
|
|
|
697
697
|
if hasattr(agent, 'name'):
|
|
698
698
|
info["name"] = agent.name
|
|
699
699
|
if hasattr(agent, 'instructions'):
|
|
700
|
-
|
|
700
|
+
instructions = agent.instructions
|
|
701
|
+
if isinstance(instructions, str) and len(instructions) > 200:
|
|
702
|
+
info["instructions"] = instructions[:200] + "..."
|
|
703
|
+
else:
|
|
704
|
+
info["instructions"] = instructions
|
|
701
705
|
if hasattr(agent, 'tools') and agent.tools:
|
|
702
706
|
info["tools"] = [getattr(tool, 'name', str(tool)) for tool in agent.tools[:5]] # First 5 tools
|
|
703
707
|
if len(agent.tools) > 5:
|