PraisonAI 4.7.11__tar.gz → 4.7.12__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.12}/PKG-INFO +10 -10
- {praisonai-4.7.11 → praisonai-4.7.12}/PraisonAI.egg-info/PKG-INFO +10 -10
- {praisonai-4.7.11 → praisonai-4.7.12}/PraisonAI.egg-info/requires.txt +9 -9
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_api_auth.py +7 -3
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_async_bridge.py +31 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_entrypoint.py +10 -14
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/agents_generator.py +27 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/api/agent_invoke.py +5 -1
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/api/call.py +66 -26
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/app/agentos.py +2 -16
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/auto.py +20 -2
- praisonai-4.7.12/praisonai/capabilities/guardrails.py +192 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/managed.py +4 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/standardise.py +3 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/background.py +6 -4
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/sandbox_cli.py +38 -29
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/direct_prompt.py +2 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/interactive_legacy.py +5 -3
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/db/adapter.py +226 -64
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/autogen_adapter.py +46 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/registry.py +55 -24
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/inbuilt_tools/__init__.py +6 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/inbuilt_tools/autogen_tools.py +4 -4
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/__init__.py +8 -1
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute_managed_agent.py +58 -16
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/registry.py +8 -3
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/__init__.py +7 -5
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/_valkey_client.py +3 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/__init__.py +3 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/base.py +105 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/orchestrator.py +57 -10
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/__init__.py +4 -3
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/base.py +98 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/serve.py +146 -29
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/_base_scheduler.py +25 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/async_agent_scheduler.py +3 -22
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/run_policy.py +13 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/security/__init__.py +2 -2
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tools/multiedit.py +117 -32
- praisonai-4.7.12/praisonai/version.py +1 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/pyproject.toml +9 -9
- {praisonai-4.7.11 → praisonai-4.7.12}/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.12}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/README.md +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/__main__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_lazy_cache.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_logging.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/acp/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/acp/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/acp/session.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/app/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/_shim.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/branding.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/_profiling.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/schedule.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/interactive/async_tui.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/interactive/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/interactive/events.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/legacy/workflow_commands.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/main.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/config/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/config/agents.schema.json +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/config/schema.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/config/validator.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/history_store.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/queue.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/setup.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/db/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/flow/client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/flow/converter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/_config_builder.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/framework_adapters/workflow_framework.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/inc/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/inc/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/bridges/schedules_runner.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integration/pages/workflow_runs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/_cli_loaders.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/_managed_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/_sync_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/compute/tenki.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/jobs/executor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/jobs/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/jobs/router.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/jobs/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/jobs/store.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/llm/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/llm/env.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/llm/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/n8n/client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/observability/hooks.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/_ops.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/profiler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/push/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/push/client.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/push/transports.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/core.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/history.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/security.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/recipe/server.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/applier.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/judge.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/plan.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/player.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/reader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/storage.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/replay/writer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/_delivery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/security/audit.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/security/injection.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/security/protected.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/setup/build.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/setup.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/_tool_sources.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/cache.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/loader.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/security.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tool_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tools/audio.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/train/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/train.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/train_vision.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui/context.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_dashboard/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/praisonai/upload_vision.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/setup.cfg +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_approval_system.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_basic.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_cli_features.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_recipe.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_registry.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/tests/test_runner.py +0 -0
- {praisonai-4.7.11 → praisonai-4.7.12}/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.12
|
|
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.10
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.9
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.9
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.9
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.9
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.11
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.9
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.9
|
|
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.12
|
|
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.10
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.9
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.9
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.9
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.9
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.11
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.9
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.9
|
|
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,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.10
|
|
5
|
+
praisonai-code>=0.1.9
|
|
6
|
+
praisonai-bot>=0.1.9
|
|
7
|
+
praisonai-train>=0.1.9
|
|
8
|
+
praisonai-browser>=0.1.9
|
|
9
|
+
praisonai-mcp>=0.1.11
|
|
10
|
+
praisonai-sandbox>=0.1.9
|
|
11
|
+
praisonai-deploy>=0.1.9
|
|
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,
|
|
@@ -599,6 +599,15 @@ class AgentsGenerator:
|
|
|
599
599
|
task_callback (callable, optional): A callback function to be executed after each tool run.
|
|
600
600
|
tools (dict): A dictionary containing the tools to be used for the agents.
|
|
601
601
|
"""
|
|
602
|
+
# Wire the built-in readers/retrievers/rerankers into the core-SDK
|
|
603
|
+
# registries so YAML `retriever:` / `reader:` / `reranker:` declarations
|
|
604
|
+
# resolve identically on every launch path (CLI, serve, eval, Python).
|
|
605
|
+
# Single-sourced here so surfaces that construct AgentsGenerator directly
|
|
606
|
+
# (praisonai <file.yaml>, serve, eval) get the same wiring as run()/arun().
|
|
607
|
+
# Idempotent + thread-safe + register-only-if-absent; safe to call again.
|
|
608
|
+
from .adapters import register_default_adapters
|
|
609
|
+
register_default_adapters()
|
|
610
|
+
|
|
602
611
|
self.agent_file = agent_file
|
|
603
612
|
self.framework = framework
|
|
604
613
|
self.config_list = config_list
|
|
@@ -964,9 +973,23 @@ class AgentsGenerator:
|
|
|
964
973
|
# Canonical format conversion: 'agents' -> 'roles', 'instructions' -> 'backstory'
|
|
965
974
|
# Treat an empty ``roles: {}`` the same as a missing one so populated
|
|
966
975
|
# ``agents:`` is still promoted instead of running with zero agents.
|
|
967
|
-
|
|
968
|
-
|
|
976
|
+
#
|
|
977
|
+
# Promotion is *authoritative*: the shorthand ``agents:`` bucket is
|
|
978
|
+
# removed after merging into ``roles:`` so downstream validators and the
|
|
979
|
+
# executor read a single source of truth. Leaving ``agents:`` in place
|
|
980
|
+
# let validators see a merged ``{**roles, **agents}`` view the executor
|
|
981
|
+
# (which reads only ``roles:``) never runs — causing double-fired
|
|
982
|
+
# warnings, false-positive validation rejections, and silently dropped
|
|
983
|
+
# ``tool_timeout``/handoff knobs for agents that never became roles.
|
|
984
|
+
if 'agents' in config and isinstance(config['agents'], dict):
|
|
985
|
+
config.setdefault('roles', {})
|
|
986
|
+
if not isinstance(config['roles'], dict):
|
|
987
|
+
config['roles'] = {}
|
|
969
988
|
for agent_name, agent_config in config['agents'].items():
|
|
989
|
+
# An entry already present under ``roles:`` is canonical and
|
|
990
|
+
# wins; only agents-only entries are promoted.
|
|
991
|
+
if agent_name in config['roles']:
|
|
992
|
+
continue
|
|
970
993
|
role_config = dict(agent_config) if agent_config else {}
|
|
971
994
|
# Convert 'instructions' to 'backstory' if present
|
|
972
995
|
if 'instructions' in role_config and 'backstory' not in role_config:
|
|
@@ -979,6 +1002,8 @@ class AgentsGenerator:
|
|
|
979
1002
|
if 'backstory' not in role_config:
|
|
980
1003
|
role_config['backstory'] = f'You are a {role_config["role"]}'
|
|
981
1004
|
config['roles'][agent_name] = role_config
|
|
1005
|
+
# Drop the shorthand bucket so validators and the executor agree.
|
|
1006
|
+
del config['agents']
|
|
982
1007
|
|
|
983
1008
|
# Get workflow input: 'input' is canonical, 'topic' is alias for backward compatibility
|
|
984
1009
|
topic = config.get('input', config.get('topic', ''))
|
|
@@ -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:
|
|
@@ -10,7 +10,7 @@ import importlib.util
|
|
|
10
10
|
import threading
|
|
11
11
|
import time
|
|
12
12
|
from typing import Optional
|
|
13
|
-
from collections import
|
|
13
|
+
from collections import OrderedDict
|
|
14
14
|
|
|
15
15
|
# Heavy, optional dependencies (websockets, fastapi, twilio, uvicorn, pyngrok,
|
|
16
16
|
# rich) are imported lazily inside the functions that need them. Importing this
|
|
@@ -93,15 +93,6 @@ MAX_CONCURRENT_CONNECTIONS = int(os.getenv('MAX_CONCURRENT_CONNECTIONS', '5'))
|
|
|
93
93
|
MAX_REQUESTS_PER_WINDOW = int(os.getenv('MAX_REQUESTS_PER_WINDOW', '100'))
|
|
94
94
|
RATE_LIMIT_WINDOW = 3600
|
|
95
95
|
|
|
96
|
-
active_connections = 0
|
|
97
|
-
client_ips = defaultdict(list)
|
|
98
|
-
|
|
99
|
-
# Guard the shared, async-mutated counters so concurrent WebSocket handlers
|
|
100
|
-
# can't over-commit MAX_CONCURRENT_CONNECTIONS / MAX_REQUESTS_PER_WINDOW via a
|
|
101
|
-
# check-then-mutate TOCTOU across ``await`` points.
|
|
102
|
-
_conn_lock = asyncio.Lock()
|
|
103
|
-
_ips_lock = asyncio.Lock()
|
|
104
|
-
|
|
105
96
|
# One-shot, short-lived session tokens handed to the Twilio media-stream client
|
|
106
97
|
# so the shared server secret is never embedded in a URL (which leaks into
|
|
107
98
|
# access logs / referrers / history).
|
|
@@ -114,16 +105,69 @@ class CallAppState:
|
|
|
114
105
|
Replaces the previous module-level ``tools`` / ``_pending_stream_sessions``
|
|
115
106
|
globals so co-hosted / multi-tenant ``build_call_app()`` instances in one
|
|
116
107
|
process never share a tool schema or cross-consume each other's stream
|
|
117
|
-
tokens.
|
|
118
|
-
``
|
|
108
|
+
tokens. The rate-limit / capacity primitives (``active_connections``,
|
|
109
|
+
``client_ips``) live here too so co-hosted tenants never cross-consume each
|
|
110
|
+
other's connection budget, and the IP map is LRU-bounded so a caller behind
|
|
111
|
+
rotating IPs cannot grow it without bound. FastAPI hands this to handlers via
|
|
112
|
+
``request.app.state`` / ``websocket.app.state``.
|
|
119
113
|
"""
|
|
120
114
|
|
|
121
|
-
__slots__ = (
|
|
115
|
+
__slots__ = (
|
|
116
|
+
"tools", "pending_sessions", "_lock",
|
|
117
|
+
"active_connections", "conn_lock",
|
|
118
|
+
"client_ips", "ips_lock", "max_ips",
|
|
119
|
+
)
|
|
122
120
|
|
|
123
|
-
def __init__(self):
|
|
121
|
+
def __init__(self, max_tracked_ips: int = 10_000):
|
|
124
122
|
self.tools: list = []
|
|
125
123
|
self.pending_sessions: "dict[str, float]" = {}
|
|
126
124
|
self._lock = threading.Lock()
|
|
125
|
+
self.active_connections = 0
|
|
126
|
+
self.conn_lock = asyncio.Lock()
|
|
127
|
+
self.client_ips: "OrderedDict[str, list[float]]" = OrderedDict()
|
|
128
|
+
self.ips_lock = asyncio.Lock()
|
|
129
|
+
self.max_ips = max_tracked_ips
|
|
130
|
+
|
|
131
|
+
def touch_ip(self, ip: str, now: float) -> "list[float]":
|
|
132
|
+
"""Return this IP's live request timestamps (window), LRU-bounded.
|
|
133
|
+
|
|
134
|
+
Only prunes expired timestamps out of the returned window — it does NOT
|
|
135
|
+
record the current request. The caller inspects the returned window
|
|
136
|
+
against ``MAX_REQUESTS_PER_WINDOW`` and, if admitted, calls
|
|
137
|
+
:meth:`record_ip` to append the new timestamp. Empty entries are dropped
|
|
138
|
+
eagerly so the map cannot grow from IPs whose windows have all expired.
|
|
139
|
+
Callers hold ``ips_lock`` across ``touch_ip`` + ``record_ip`` so the
|
|
140
|
+
check-then-record stays atomic across ``await`` points.
|
|
141
|
+
"""
|
|
142
|
+
window = [t for t in self.client_ips.get(ip, ()) if now - t < RATE_LIMIT_WINDOW]
|
|
143
|
+
if window:
|
|
144
|
+
self.client_ips[ip] = window
|
|
145
|
+
self.client_ips.move_to_end(ip)
|
|
146
|
+
else:
|
|
147
|
+
# No live timestamps: drop the stale entry now. It is only re-added
|
|
148
|
+
# by record_ip() if this request is admitted, so a rejected caller
|
|
149
|
+
# never leaves a residue.
|
|
150
|
+
self.client_ips.pop(ip, None)
|
|
151
|
+
return window
|
|
152
|
+
|
|
153
|
+
def record_ip(self, ip: str, window: "list[float]", now: float) -> None:
|
|
154
|
+
"""Append ``now`` to this IP's admitted-request window and enforce the cap.
|
|
155
|
+
|
|
156
|
+
Pins ``ip`` as the most-recently-used entry, then evicts the oldest
|
|
157
|
+
entries so the map holds at most ``max_ips`` keys *after* this insert.
|
|
158
|
+
Eviction runs post-insert so the live caller is never the victim and the
|
|
159
|
+
map never transiently exceeds ``max_ips`` — the cap it promises. Because
|
|
160
|
+
eviction can drop another IP whose window is still open, ``max_ips``
|
|
161
|
+
should be provisioned above the realistic distinct-IP working set (the
|
|
162
|
+
10k default), so eviction only bites under a rotating-IP flood — exactly
|
|
163
|
+
the unbounded-growth case the bound exists to contain.
|
|
164
|
+
"""
|
|
165
|
+
window.append(now)
|
|
166
|
+
self.client_ips[ip] = window
|
|
167
|
+
self.client_ips.move_to_end(ip)
|
|
168
|
+
while len(self.client_ips) > self.max_ips:
|
|
169
|
+
# last=False evicts the oldest (LRU); the just-touched ip is MRU.
|
|
170
|
+
self.client_ips.popitem(last=False)
|
|
127
171
|
|
|
128
172
|
def mint_stream_token(self) -> str:
|
|
129
173
|
"""Create a single-use, TTL-bound token for the media-stream handshake."""
|
|
@@ -456,8 +500,6 @@ async def handle_media_stream(websocket):
|
|
|
456
500
|
import websockets
|
|
457
501
|
from fastapi.websockets import WebSocketDisconnect
|
|
458
502
|
|
|
459
|
-
global active_connections
|
|
460
|
-
|
|
461
503
|
# 1. Authentication — accept a one-shot, per-connection session token
|
|
462
504
|
# (from the ``session`` query param minted by the incoming-call handler,
|
|
463
505
|
# or an ``x-call-token`` header). The shared CALL_SERVER_TOKEN is never
|
|
@@ -481,22 +523,20 @@ async def handle_media_stream(websocket):
|
|
|
481
523
|
# over-commit the window via a check-then-mutate race across ``await``.
|
|
482
524
|
client_ip = websocket.client.host if websocket.client else "unknown"
|
|
483
525
|
now = time.time()
|
|
484
|
-
async with
|
|
485
|
-
window =
|
|
526
|
+
async with state.ips_lock:
|
|
527
|
+
window = state.touch_ip(client_ip, now)
|
|
486
528
|
if len(window) >= MAX_REQUESTS_PER_WINDOW:
|
|
487
|
-
client_ips[client_ip] = window
|
|
488
529
|
await websocket.close(code=4029, reason="Rate limit exceeded")
|
|
489
530
|
return
|
|
490
|
-
|
|
491
|
-
client_ips[client_ip] = window
|
|
531
|
+
state.record_ip(client_ip, window, now)
|
|
492
532
|
|
|
493
533
|
# 3. Connection Limiting — atomically check-and-increment under the lock so
|
|
494
534
|
# MAX_CONCURRENT_CONNECTIONS is never over-committed.
|
|
495
|
-
async with
|
|
496
|
-
if active_connections >= MAX_CONCURRENT_CONNECTIONS:
|
|
535
|
+
async with state.conn_lock:
|
|
536
|
+
if state.active_connections >= MAX_CONCURRENT_CONNECTIONS:
|
|
497
537
|
await websocket.close(code=1013, reason="Server busy")
|
|
498
538
|
return
|
|
499
|
-
active_connections += 1
|
|
539
|
+
state.active_connections += 1
|
|
500
540
|
try:
|
|
501
541
|
print("Client connected")
|
|
502
542
|
await websocket.accept()
|
|
@@ -570,8 +610,8 @@ async def handle_media_stream(websocket):
|
|
|
570
610
|
|
|
571
611
|
await asyncio.gather(receive_from_twilio(), send_to_twilio())
|
|
572
612
|
finally:
|
|
573
|
-
async with
|
|
574
|
-
active_connections -= 1
|
|
613
|
+
async with state.conn_lock:
|
|
614
|
+
state.active_connections -= 1
|
|
575
615
|
|
|
576
616
|
async def handle_response_done(state, response, openai_ws):
|
|
577
617
|
"""Handle the response.done event and process any function calls."""
|
|
@@ -128,22 +128,8 @@ class AgentOS:
|
|
|
128
128
|
|
|
129
129
|
launch_token = self.config.api_key or os.environ.get("PRAISONAI_AGENTOS_API_KEY")
|
|
130
130
|
if launch_token:
|
|
131
|
-
from
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
expected = launch_token
|
|
135
|
-
|
|
136
|
-
class _AgentOSAuthMiddleware(BaseHTTPMiddleware):
|
|
137
|
-
async def dispatch(self, request, call_next):
|
|
138
|
-
if request.url.path in ("/health", "/"):
|
|
139
|
-
return await call_next(request)
|
|
140
|
-
auth = request.headers.get("Authorization", "")
|
|
141
|
-
token = auth[7:] if auth.startswith("Bearer ") else request.headers.get("X-API-Key", "")
|
|
142
|
-
if token != expected:
|
|
143
|
-
return JSONResponse({"error": "Unauthorized"}, status_code=401)
|
|
144
|
-
return await call_next(request)
|
|
145
|
-
|
|
146
|
-
app.add_middleware(_AgentOSAuthMiddleware)
|
|
131
|
+
from .._api_auth import build_api_key_middleware
|
|
132
|
+
app.add_middleware(build_api_key_middleware(launch_token, {"/health", "/"}))
|
|
147
133
|
|
|
148
134
|
return app
|
|
149
135
|
|
|
@@ -16,6 +16,7 @@ import json
|
|
|
16
16
|
import re
|
|
17
17
|
import asyncio
|
|
18
18
|
import threading
|
|
19
|
+
import warnings
|
|
19
20
|
from praisonai._logging import get_logger
|
|
20
21
|
|
|
21
22
|
# Type variable for Pydantic models - will be bound at runtime
|
|
@@ -1046,7 +1047,9 @@ class AutoGenerator(BaseAutoGenerator):
|
|
|
1046
1047
|
generate → run round-trip agrees on defaults.
|
|
1047
1048
|
config_list: Optional LLM configuration
|
|
1048
1049
|
pattern: Workflow pattern (sequential, parallel, routing, orchestrator-workers, evaluator-optimizer)
|
|
1049
|
-
single_agent:
|
|
1050
|
+
single_agent: Deprecated and inert. Single-agent generation is not
|
|
1051
|
+
implemented; a team structure is always generated. Passing a
|
|
1052
|
+
truthy value emits a ``DeprecationWarning``.
|
|
1050
1053
|
|
|
1051
1054
|
Note: autogen framework is different from this AutoGenerator class.
|
|
1052
1055
|
"""
|
|
@@ -1077,6 +1080,12 @@ class AutoGenerator(BaseAutoGenerator):
|
|
|
1077
1080
|
# Authoritative framework name comes from the resolved adapter.
|
|
1078
1081
|
self.framework = adapter.name
|
|
1079
1082
|
self.pattern = pattern
|
|
1083
|
+
if single_agent:
|
|
1084
|
+
warnings.warn(
|
|
1085
|
+
"single_agent generation is not implemented; a team structure "
|
|
1086
|
+
"is generated instead. This parameter is deprecated and inert.",
|
|
1087
|
+
DeprecationWarning, stacklevel=2,
|
|
1088
|
+
)
|
|
1080
1089
|
self.single_agent = single_agent
|
|
1081
1090
|
|
|
1082
1091
|
|
|
@@ -1638,7 +1647,9 @@ class WorkflowAutoGenerator(BaseAutoGenerator):
|
|
|
1638
1647
|
the generate → run round-trip agrees on defaults. The adapter
|
|
1639
1648
|
is validated here rather than deferring the failure to a later
|
|
1640
1649
|
``praisonai run`` invocation.
|
|
1641
|
-
single_agent:
|
|
1650
|
+
single_agent: Deprecated and inert. Single-agent workflow generation
|
|
1651
|
+
is not implemented; a workflow structure is always generated.
|
|
1652
|
+
Passing a truthy value emits a ``DeprecationWarning``.
|
|
1642
1653
|
workspace: Optional workspace root; when set, ``workflow_file`` is
|
|
1643
1654
|
contained to it to reject path traversal (see BaseAutoGenerator).
|
|
1644
1655
|
"""
|
|
@@ -1657,6 +1668,13 @@ class WorkflowAutoGenerator(BaseAutoGenerator):
|
|
|
1657
1668
|
self.topic = topic
|
|
1658
1669
|
self.workflow_file = self._safe_join(workflow_file)
|
|
1659
1670
|
self.framework = adapter.name
|
|
1671
|
+
if single_agent:
|
|
1672
|
+
warnings.warn(
|
|
1673
|
+
"single_agent generation is not implemented; a workflow "
|
|
1674
|
+
"structure is generated instead. This parameter is deprecated "
|
|
1675
|
+
"and inert.",
|
|
1676
|
+
DeprecationWarning, stacklevel=2,
|
|
1677
|
+
)
|
|
1660
1678
|
self.single_agent = single_agent
|
|
1661
1679
|
|
|
1662
1680
|
def recommend_pattern_llm(self, topic: Optional[str] = None) -> Any:
|