PraisonAI 4.7.0__tar.gz → 4.7.4__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.0 → praisonai-4.7.4}/PKG-INFO +9 -9
- {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/PKG-INFO +9 -9
- {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/SOURCES.txt +0 -5
- {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/requires.txt +8 -8
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/__main__.py +105 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_async_bridge.py +31 -8
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/generator.py +20 -2
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/typescript_extractor.py +7 -1
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_lazy_cache.py +9 -5
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/agents_generator.py +124 -16
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/api/agent_invoke.py +60 -3
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/api/call.py +259 -93
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/__init__.py +1 -1
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/container_files.py +10 -13
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/containers.py +8 -22
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/search.py +19 -23
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/vector_store_files.py +54 -85
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/_shim.py +49 -14
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/schedule.py +52 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/persistence.py +23 -19
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/dispatch/argparse_builder.py +9 -1
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/validator.py +17 -2
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/db/adapter.py +44 -8
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/_config_builder.py +25 -7
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/autogen_adapter.py +50 -8
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/crewai_adapter.py +8 -2
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/praisonai_adapter.py +59 -24
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/schedules_runner.py +14 -2
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/base.py +30 -16
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/executor.py +89 -16
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/router.py +27 -3
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/sqlite.py +38 -6
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/orchestrator.py +54 -20
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/async_mongodb.py +157 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/dynamodb.py +96 -23
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/firestore.py +43 -21
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/serve.py +73 -21
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/_base_scheduler.py +265 -16
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/_delivery.py +50 -6
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/agent_scheduler.py +75 -79
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/async_agent_scheduler.py +134 -6
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/yaml_loader.py +1 -1
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/audit.py +26 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/ai_generator.py +38 -6
- praisonai-4.7.4/praisonai/version.py +1 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/pyproject.toml +9 -9
- praisonai-4.7.0/praisonai/persistence/tests/__init__.py +0 -3
- praisonai-4.7.0/praisonai/persistence/tests/test_all_backends.py +0 -633
- praisonai-4.7.0/praisonai/persistence/tests/test_registry_lazy.py +0 -80
- praisonai-4.7.0/praisonai/persistence/tests/test_valkey_backends.py +0 -492
- praisonai-4.7.0/praisonai/standardise/enhanced_templates.py +0 -680
- praisonai-4.7.0/praisonai/version.py +0 -1
- {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/README.md +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_api_auth.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/docs_generator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/python_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/rust_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/topic_normalizer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_entrypoint.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_logging.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/session.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/app/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/app/agentos.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/auto.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/guardrails.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/branding.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/_profiling.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/managed.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/standardise.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/background.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/sandbox_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/async_tui.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/events.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/direct_prompt.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/interactive_legacy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/workflow_commands.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/main.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/agents.schema.json +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/schema.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/history_store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/queue.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/setup.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/db/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/converter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/workflow_framework.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inc/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inc/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/pages/workflow_runs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_cli_loaders.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_unified_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/_sync_base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/tenki.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute_managed_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/env.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/hooks.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/_valkey_client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/_ops.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/profiler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/push/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/push/client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/push/transports.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/core.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/history.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/security.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/applier.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/judge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/plan.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/player.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/reader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/storage.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/writer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/run_policy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/injection.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/protected.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/build.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/manifest.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/_tool_sources.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/cache.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/loader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/security.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tool_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/audio.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/multiedit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/train/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/train.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/train_vision.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/context.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_dashboard/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/upload_vision.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/setup.cfg +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_approval_system.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_basic.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_cli_features.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_runner.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_sandboxed_agent_compatibility.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_serve_features.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.4
|
|
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.2
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.1
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.1
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.1
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.1
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.3
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.1
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.1
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 4.7.
|
|
3
|
+
Version: 4.7.4
|
|
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.2
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.1
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.1
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.1
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.1
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.3
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.1
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.1
|
|
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
|
|
@@ -436,10 +436,6 @@ praisonai/persistence/state/mongodb.py
|
|
|
436
436
|
praisonai/persistence/state/redis.py
|
|
437
437
|
praisonai/persistence/state/upstash.py
|
|
438
438
|
praisonai/persistence/state/valkey.py
|
|
439
|
-
praisonai/persistence/tests/__init__.py
|
|
440
|
-
praisonai/persistence/tests/test_all_backends.py
|
|
441
|
-
praisonai/persistence/tests/test_registry_lazy.py
|
|
442
|
-
praisonai/persistence/tests/test_valkey_backends.py
|
|
443
439
|
praisonai/push/__init__.py
|
|
444
440
|
praisonai/push/client.py
|
|
445
441
|
praisonai/push/transports.py
|
|
@@ -501,7 +497,6 @@ praisonai/standardise/dedupe.py
|
|
|
501
497
|
praisonai/standardise/discovery.py
|
|
502
498
|
praisonai/standardise/drift.py
|
|
503
499
|
praisonai/standardise/engine.py
|
|
504
|
-
praisonai/standardise/enhanced_templates.py
|
|
505
500
|
praisonai/standardise/example_verifier.py
|
|
506
501
|
praisonai/standardise/manifest.py
|
|
507
502
|
praisonai/standardise/models.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.2
|
|
5
|
+
praisonai-code>=0.1.1
|
|
6
|
+
praisonai-bot>=0.1.1
|
|
7
|
+
praisonai-train>=0.1.1
|
|
8
|
+
praisonai-browser>=0.1.1
|
|
9
|
+
praisonai-mcp>=0.1.3
|
|
10
|
+
praisonai-sandbox>=0.1.1
|
|
11
|
+
praisonai-deploy>=0.1.1
|
|
12
12
|
python-dotenv>=0.19.0
|
|
13
13
|
litellm<2,>=1.83.14
|
|
14
14
|
PyYAML>=6.0
|
|
@@ -23,6 +23,44 @@ import threading
|
|
|
23
23
|
_typer_commands_cache = None
|
|
24
24
|
_typer_commands_lock = threading.Lock()
|
|
25
25
|
|
|
26
|
+
# Cache for the legacy dispatcher's implemented-verb set. ``None`` means "not yet
|
|
27
|
+
# computed"; a frozenset once derived. Populated lazily from the legacy
|
|
28
|
+
# argparse builder's authoritative ``LEGACY_SPECIAL_COMMANDS`` oracle so the
|
|
29
|
+
# unified dispatcher never reclassifies an *implemented* verb as free text and
|
|
30
|
+
# bills it to an LLM (#4327).
|
|
31
|
+
_legacy_verbs_cache = None
|
|
32
|
+
_legacy_verbs_lock = threading.Lock()
|
|
33
|
+
|
|
34
|
+
# Fail-closed fallback for :func:`_get_legacy_verbs`. If importing the
|
|
35
|
+
# authoritative ``LEGACY_SPECIAL_COMMANDS`` oracle ever fails, we must NOT return
|
|
36
|
+
# an empty set — that would let an *implemented* verb (``thinking status`` etc.)
|
|
37
|
+
# fall through to the bare-prompt rule and be billed to an LLM, reintroducing the
|
|
38
|
+
# #4327 regression. This static mirror keeps the routing guard functional so such
|
|
39
|
+
# verbs still reach the legacy handler even when discovery is degraded. It only
|
|
40
|
+
# needs to stay a *superset-safe* copy of the oracle; drift merely means a newly
|
|
41
|
+
# added verb isn't recognised until the oracle import recovers, never a bill.
|
|
42
|
+
_LEGACY_VERBS_FALLBACK = frozenset({
|
|
43
|
+
'chat', 'code', 'call', 'realtime', 'train', 'ui', 'context', 'research',
|
|
44
|
+
'memory', 'rules', 'workflow', 'hooks', 'knowledge', 'session', 'tools',
|
|
45
|
+
'todo', 'docs', 'mcp', 'commit', 'serve', 'schedule', 'skills', 'profile',
|
|
46
|
+
'eval', 'agents', 'run', 'thinking', 'compaction', 'output', 'deploy',
|
|
47
|
+
'templates', 'recipe', 'endpoints', 'audio', 'embed', 'embedding', 'images',
|
|
48
|
+
'moderate', 'files', 'batches', 'vector-stores', 'rerank', 'ocr',
|
|
49
|
+
'assistants', 'fine-tuning', 'completions', 'messages', 'guardrails', 'rag',
|
|
50
|
+
'videos', 'a2a', 'containers', 'passthrough', 'responses', 'search',
|
|
51
|
+
'realtime-api', 'doctor', 'registry', 'package', 'install', 'uninstall',
|
|
52
|
+
'acp', 'debug', 'lsp', 'diag', 'browser', 'replay', 'bot', 'gateway',
|
|
53
|
+
'sandbox', 'wizard', 'migrate', 'security', 'persistence', 'paths', 'claw',
|
|
54
|
+
'github', 'managed', 'flow', 'dashboard', 'backends', 'audit',
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
# Verbs excluded from the "route implemented verbs to legacy" guard. ``containers``
|
|
58
|
+
# and ``vector-stores`` reach a capability that fabricates a success with zero
|
|
59
|
+
# network (#4322); restoring their routing would promote that fabrication from
|
|
60
|
+
# unreachable to user-visible, so they are held back until #4322 lands. They keep
|
|
61
|
+
# their current behaviour rather than being rerouted here.
|
|
62
|
+
_LEGACY_VERB_ROUTING_EXCLUSIONS = frozenset({"containers", "vector-stores"})
|
|
63
|
+
|
|
26
64
|
# Cache for the run command's supported option names. ``None`` means "not yet
|
|
27
65
|
# computed"; a tuple ``(all_opts, value_opts)`` once derived; ``False`` marks a
|
|
28
66
|
# discovery failure so the conservative legacy fallback is used without retrying
|
|
@@ -263,6 +301,64 @@ def _get_typer_commands():
|
|
|
263
301
|
return _typer_commands_cache
|
|
264
302
|
|
|
265
303
|
|
|
304
|
+
def _get_legacy_verbs():
|
|
305
|
+
"""Auto-discover the legacy dispatcher's implemented-verb set.
|
|
306
|
+
|
|
307
|
+
Sourced from the legacy argparse builder's authoritative
|
|
308
|
+
``LEGACY_SPECIAL_COMMANDS`` oracle so this stays in lockstep with the verbs
|
|
309
|
+
legacy actually handles.
|
|
310
|
+
|
|
311
|
+
Fails *closed*: if the oracle import raises, return the static
|
|
312
|
+
:data:`_LEGACY_VERBS_FALLBACK` mirror rather than an empty set. An empty set
|
|
313
|
+
would let an implemented verb fall through to the bare-prompt rule and be
|
|
314
|
+
billed to an LLM — the #4327 regression this guard exists to prevent. The
|
|
315
|
+
fallback is *not* cached so a later caller can still pick up the authoritative
|
|
316
|
+
oracle once the transient import failure clears.
|
|
317
|
+
"""
|
|
318
|
+
global _legacy_verbs_cache
|
|
319
|
+
|
|
320
|
+
if _legacy_verbs_cache is not None:
|
|
321
|
+
return _legacy_verbs_cache
|
|
322
|
+
|
|
323
|
+
with _legacy_verbs_lock:
|
|
324
|
+
if _legacy_verbs_cache is not None: # Double-check
|
|
325
|
+
return _legacy_verbs_cache
|
|
326
|
+
|
|
327
|
+
try:
|
|
328
|
+
from praisonai.cli.legacy.dispatch.argparse_builder import (
|
|
329
|
+
LEGACY_SPECIAL_COMMANDS,
|
|
330
|
+
)
|
|
331
|
+
verbs = frozenset(LEGACY_SPECIAL_COMMANDS)
|
|
332
|
+
except Exception:
|
|
333
|
+
import logging
|
|
334
|
+
logging.getLogger("praisonai.__main__").warning(
|
|
335
|
+
"Legacy verb discovery failed; using static fallback registry so "
|
|
336
|
+
"implemented verbs still route to their handler (not the LLM).",
|
|
337
|
+
exc_info=True,
|
|
338
|
+
)
|
|
339
|
+
# Fail closed: recognise implemented verbs from the static mirror.
|
|
340
|
+
# Do NOT poison the cache — a later caller can still load the oracle.
|
|
341
|
+
return _LEGACY_VERBS_FALLBACK
|
|
342
|
+
|
|
343
|
+
_legacy_verbs_cache = verbs
|
|
344
|
+
return _legacy_verbs_cache
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
def _is_implemented_legacy_verb(first_cmd):
|
|
348
|
+
"""True when ``first_cmd`` is a verb the legacy dispatcher implements.
|
|
349
|
+
|
|
350
|
+
Such a token is an *implemented command*, not free text — it must reach its
|
|
351
|
+
handler on the legacy path, never be joined/quoted and billed to an LLM by
|
|
352
|
+
the modern ``run`` forwarder (#4327). A small exclusion set
|
|
353
|
+
(:data:`_LEGACY_VERB_ROUTING_EXCLUSIONS`) is withheld pending #4322.
|
|
354
|
+
"""
|
|
355
|
+
if not first_cmd:
|
|
356
|
+
return False
|
|
357
|
+
if first_cmd in _LEGACY_VERB_ROUTING_EXCLUSIONS:
|
|
358
|
+
return False
|
|
359
|
+
return first_cmd in _get_legacy_verbs()
|
|
360
|
+
|
|
361
|
+
|
|
266
362
|
def _iter_argv_tokens(argv, value_opts=None):
|
|
267
363
|
"""Classify each ``argv`` token, yielding ``(arg, name, kind)``.
|
|
268
364
|
|
|
@@ -610,6 +706,15 @@ def main():
|
|
|
610
706
|
_run_typer(argv)
|
|
611
707
|
return
|
|
612
708
|
|
|
709
|
+
# A verb the legacy dispatcher implements is a *command*, not free text.
|
|
710
|
+
# Without this guard it falls through to the bare-prompt rule below and is
|
|
711
|
+
# joined/quoted into a modern ``run`` prompt and billed to an LLM (#4327):
|
|
712
|
+
# ``praisonai thinking status`` costs ~2.5k tokens and exits 0 instead of
|
|
713
|
+
# reaching its handler. Route it to legacy, which owns the handler.
|
|
714
|
+
if _is_implemented_legacy_verb(first_cmd):
|
|
715
|
+
_run_legacy(argv)
|
|
716
|
+
return
|
|
717
|
+
|
|
613
718
|
# A lone token that is a near-miss for a registered command is a mistyped
|
|
614
719
|
# verb, not a prompt. Without this guard it falls through to the bare-prompt
|
|
615
720
|
# rule below and is billed to an LLM: ``praisonai deploi`` costs money and
|
|
@@ -291,22 +291,45 @@ def run_sync_or_offload(
|
|
|
291
291
|
:class:`AsyncBridge` via :func:`run_sync`, sharing its background loop and
|
|
292
292
|
connection pools.
|
|
293
293
|
- Called from inside a running loop (FastAPI handler, Jupyter, async test):
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
294
|
+
by default this raises ``RuntimeError`` rather than blocking the loop,
|
|
295
|
+
pointing callers at the awaitable siblings (:func:`arun_sync_or_offload`,
|
|
296
|
+
``adapter.arun``, ``praisonai.arun``). Set
|
|
297
|
+
``PRAISONAI_ALLOW_LOOP_BLOCKING=true`` to opt into the legacy behaviour
|
|
298
|
+
that copies the caller's ContextVars onto a worker thread handing the
|
|
299
|
+
coroutine to the SAME bridge (never a fresh ``asyncio.new_event_loop()``)
|
|
300
|
+
and joins it — which pins the loop for up to ``timeout`` seconds.
|
|
299
301
|
|
|
300
302
|
Callers who *know* they are on a sync-only path should use :func:`run_sync`
|
|
301
|
-
(it fails loudly inside a loop).
|
|
302
|
-
|
|
303
|
-
running-loop handling lives in one place instead of being re-implemented.
|
|
303
|
+
(it fails loudly inside a loop). Async callers should ``await``
|
|
304
|
+
:func:`arun_sync_or_offload`, which never blocks the loop.
|
|
304
305
|
"""
|
|
305
306
|
try:
|
|
306
307
|
asyncio.get_running_loop()
|
|
307
308
|
except RuntimeError:
|
|
308
309
|
return run_sync(coro, timeout=timeout)
|
|
309
310
|
|
|
311
|
+
# Strict path (default): never block a running event loop. Joining the
|
|
312
|
+
# worker thread from the loop thread pins the loop for up to ``timeout``
|
|
313
|
+
# seconds — exactly the "async-safe" pathology this project forbids. Steer
|
|
314
|
+
# callers to the awaitable siblings that never block the loop.
|
|
315
|
+
if os.environ.get("PRAISONAI_ALLOW_LOOP_BLOCKING", "").lower() not in (
|
|
316
|
+
"1",
|
|
317
|
+
"true",
|
|
318
|
+
):
|
|
319
|
+
# Close the coroutine we are refusing to run so it does not leak as a
|
|
320
|
+
# "coroutine was never awaited" warning.
|
|
321
|
+
with contextlib.suppress(Exception):
|
|
322
|
+
coro.close() # type: ignore[attr-defined]
|
|
323
|
+
raise RuntimeError(
|
|
324
|
+
"run_sync_or_offload() would block the running event loop for up to "
|
|
325
|
+
f"{timeout}s. From an async context, await one of:\n"
|
|
326
|
+
" - praisonai.arun(...)\n"
|
|
327
|
+
" - adapter.arun(...)\n"
|
|
328
|
+
" - praisonai._async_bridge.arun_sync_or_offload(coro)\n"
|
|
329
|
+
"Set PRAISONAI_ALLOW_LOOP_BLOCKING=true to opt into the legacy "
|
|
330
|
+
"blocking behaviour."
|
|
331
|
+
)
|
|
332
|
+
|
|
310
333
|
result: list[T] = []
|
|
311
334
|
error: list[BaseException] = []
|
|
312
335
|
# Hold the concurrent.futures.Future for the in-flight coroutine so the
|
|
@@ -453,6 +453,16 @@ class ParityTrackerGenerator:
|
|
|
453
453
|
lines.append(f"> **Version:** {tracker['version']} | **Last Updated:** {tracker['lastUpdated']}")
|
|
454
454
|
lines.append(f"> **Source of Truth:** {tracker['sourceOfTruth']}")
|
|
455
455
|
lines.append("")
|
|
456
|
+
lines.append("> [!IMPORTANT]")
|
|
457
|
+
lines.append("> **What this measures:** whether a matching *exported symbol name* exists in")
|
|
458
|
+
lines.append("> the TypeScript SDK's public surface (parsed from `src/index.ts`). It does **not**")
|
|
459
|
+
lines.append("> verify that the capability is reachable, wired up, or behaves like its Python")
|
|
460
|
+
lines.append("> counterpart. A `✅ exported` cell means the name is exported — not that it works.")
|
|
461
|
+
lines.append("> Counts include barrel re-exports, so `TypeScript Features` reflects module")
|
|
462
|
+
lines.append("> structure, not distinct capabilities, and is not directly comparable to the")
|
|
463
|
+
lines.append("> Python count. For a capability with a testable contract, rely on its conformance")
|
|
464
|
+
lines.append("> suite rather than this table.")
|
|
465
|
+
lines.append("")
|
|
456
466
|
|
|
457
467
|
# Summary
|
|
458
468
|
summary = tracker['summary']
|
|
@@ -482,7 +492,7 @@ class ParityTrackerGenerator:
|
|
|
482
492
|
done_count = sum(1 for g in gaps if g['status'] == 'DONE')
|
|
483
493
|
todo_count = len(gaps) - done_count
|
|
484
494
|
|
|
485
|
-
lines.append(f"### {priority_key} ({done_count}
|
|
495
|
+
lines.append(f"### {priority_key} ({done_count} exported, {todo_count} missing)")
|
|
486
496
|
lines.append("")
|
|
487
497
|
lines.append("| Feature | Python | TypeScript | Effort | Status |")
|
|
488
498
|
lines.append("|---------|--------|------------|--------|--------|")
|
|
@@ -490,7 +500,7 @@ class ParityTrackerGenerator:
|
|
|
490
500
|
for gap in sorted(gaps, key=lambda x: (x['status'] != 'TODO', x['feature'])):
|
|
491
501
|
py = "✅" if gap['python'] else "❌"
|
|
492
502
|
ts = "✅" if gap['typescript'] else "❌"
|
|
493
|
-
status = "✅
|
|
503
|
+
status = "✅ exported" if gap['status'] == 'DONE' else "⏳ missing"
|
|
494
504
|
feature = _escape_md(gap['feature'])
|
|
495
505
|
lines.append(f"| `{feature}` | {py} | {ts} | {gap['effort']} | {status} |")
|
|
496
506
|
|
|
@@ -617,6 +627,14 @@ class ParityTrackerGenerator:
|
|
|
617
627
|
lines.append("")
|
|
618
628
|
lines.append(f"> **Python Features:** {python_count} | **Rust Features:** {rust_count} | **Parity:** {parity_pct}%")
|
|
619
629
|
lines.append("")
|
|
630
|
+
lines.append("> [!IMPORTANT]")
|
|
631
|
+
lines.append("> **What this measures:** whether a matching *exported symbol name* exists in the")
|
|
632
|
+
lines.append("> Rust crate's public surface. It does **not** verify that the capability is")
|
|
633
|
+
lines.append("> reachable or behaves like its Python counterpart — an exported item whose body")
|
|
634
|
+
lines.append("> returns `Err(\"not yet implemented\")` still counts here. Treat `✅` as \"a symbol")
|
|
635
|
+
lines.append("> of this name is exported\", not \"this works\". For a capability with a testable")
|
|
636
|
+
lines.append("> contract, rely on its conformance suite rather than this table.")
|
|
637
|
+
lines.append("")
|
|
620
638
|
lines.append("## Summary")
|
|
621
639
|
lines.append("")
|
|
622
640
|
lines.append("| Metric | Count |")
|
|
@@ -55,8 +55,14 @@ class TypeScriptFeatureExtractor:
|
|
|
55
55
|
- export { Name } from './path' statements
|
|
56
56
|
- export type { Name } from './path' statements
|
|
57
57
|
- export * from './path' statements
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
It categorizes exports into modules based on their source paths.
|
|
60
|
+
|
|
61
|
+
IMPORTANT — this measures symbol *names*, not behaviour. Presence of an
|
|
62
|
+
exported name here does NOT mean the capability is reachable, wired up, or
|
|
63
|
+
behaviourally equivalent to its Python counterpart. A name that is exported
|
|
64
|
+
but never called (e.g. an approval manager that no code path invokes) still
|
|
65
|
+
shows up. Downstream reports must label these as "exported", not "done".
|
|
60
66
|
"""
|
|
61
67
|
|
|
62
68
|
# Module category mapping based on source paths
|
|
@@ -6,7 +6,7 @@ T = TypeVar("T")
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class LazyCache:
|
|
9
|
-
"""Thread-safe double-checked lazy cache. Caches and re-raises
|
|
9
|
+
"""Thread-safe double-checked lazy cache. Caches and re-raises terminal loader failures."""
|
|
10
10
|
|
|
11
11
|
def __init__(self) -> None:
|
|
12
12
|
self._cache: Dict[str, object] = {}
|
|
@@ -16,19 +16,23 @@ class LazyCache:
|
|
|
16
16
|
if key in self._cache:
|
|
17
17
|
cached = self._cache[key]
|
|
18
18
|
# Re-raise cached exception
|
|
19
|
-
if isinstance(cached,
|
|
19
|
+
if isinstance(cached, BaseException):
|
|
20
20
|
raise cached
|
|
21
21
|
return cached # type: ignore[return-value]
|
|
22
22
|
with self._lock:
|
|
23
23
|
if key in self._cache:
|
|
24
24
|
cached = self._cache[key]
|
|
25
|
-
if isinstance(cached,
|
|
25
|
+
if isinstance(cached, BaseException):
|
|
26
26
|
raise cached
|
|
27
27
|
return cached # type: ignore[return-value]
|
|
28
28
|
try:
|
|
29
29
|
value: object = loader()
|
|
30
|
-
except
|
|
31
|
-
#
|
|
30
|
+
except (KeyboardInterrupt, SystemExit):
|
|
31
|
+
# Control-flow exceptions must propagate cleanly, never memoised.
|
|
32
|
+
raise
|
|
33
|
+
except BaseException as e:
|
|
34
|
+
# Cache every terminal loader failure so a broken optional dep
|
|
35
|
+
# fails fast instead of re-running the import/probe every call.
|
|
32
36
|
self._cache[key] = e
|
|
33
37
|
raise
|
|
34
38
|
self._cache[key] = value
|
|
@@ -897,12 +897,40 @@ class AgentsGenerator:
|
|
|
897
897
|
# Enforce tool_timeout from CLI/YAML at the wrapper layer so the field is
|
|
898
898
|
# not silently dropped. The timeout stack (_wrap_tool_with_timeout) is
|
|
899
899
|
# framework-agnostic and works for both the native and external adapters.
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
900
|
+
# Determine whether a single uniform timeout applies to every agent, or
|
|
901
|
+
# whether agents declared *heterogeneous* per-agent budgets. A uniform
|
|
902
|
+
# value can still be wrapped once onto the shared dict (cheapest path);
|
|
903
|
+
# heterogeneous values must be wrapped per-agent so a documented
|
|
904
|
+
# per-agent ``tool_timeout`` is honoured instead of being silently
|
|
905
|
+
# downgraded to the tightest value for the whole run.
|
|
906
|
+
# The uniform and per-agent paths are mutually exclusive. Always resolve
|
|
907
|
+
# BOTH internal keys on every call (setting the inactive one to None) so
|
|
908
|
+
# that when the *same* generator instance is reused with a different
|
|
909
|
+
# timeout layout, a stale closure from a previous run can never leak into
|
|
910
|
+
# the adapters and apply the wrong budget to the current run.
|
|
911
|
+
uniform = self._resolve_uniform_tool_timeout(config)
|
|
912
|
+
wrap = None
|
|
913
|
+
resolver = None
|
|
914
|
+
if uniform and uniform > 0:
|
|
915
|
+
wrap = lambda t, _sec=uniform: self._wrap_tool_with_timeout(t, _sec)
|
|
916
|
+
tools_dict = {name: wrap(tool) for name, tool in tools_dict.items()}
|
|
917
|
+
else:
|
|
918
|
+
# No single uniform timeout. If any agent declared a per-agent
|
|
919
|
+
# tool_timeout, expose a resolver so adapters wrap each agent's tools
|
|
920
|
+
# with that agent's own budget (tools stay shared; only the guard
|
|
921
|
+
# closure differs). Falls back to no wrap for agents without one.
|
|
922
|
+
resolver = self.make_agent_tool_wrap_resolver(config)
|
|
923
|
+
|
|
924
|
+
# Expose the per-run wrap so adapters that inject *more* tools after this
|
|
925
|
+
# point (e.g. PraisonAIAdapter's ACP/LSP centric tools) apply the same
|
|
926
|
+
# timeout guard instead of silently bypassing it; expose the per-agent
|
|
927
|
+
# resolver for heterogeneous budgets. Both keys are written every time so
|
|
928
|
+
# the inactive path is cleared rather than left holding a prior closure.
|
|
929
|
+
self.cli_config = {
|
|
930
|
+
**(self.cli_config or {}),
|
|
931
|
+
"_tool_timeout_wrap": wrap,
|
|
932
|
+
"_agent_tool_wrap_resolver": resolver,
|
|
933
|
+
}
|
|
906
934
|
return tools_dict
|
|
907
935
|
|
|
908
936
|
def _resolve_effective_tool_timeout(self, config):
|
|
@@ -943,6 +971,84 @@ class AgentsGenerator:
|
|
|
943
971
|
)
|
|
944
972
|
return tightest
|
|
945
973
|
|
|
974
|
+
@staticmethod
|
|
975
|
+
def _declared_agent_timeout(entity):
|
|
976
|
+
"""Return a positive numeric ``tool_timeout`` declared on an entity, else None."""
|
|
977
|
+
v = entity.get("tool_timeout") if isinstance(entity, dict) else None
|
|
978
|
+
if isinstance(v, (int, float)) and not isinstance(v, bool):
|
|
979
|
+
return float(v)
|
|
980
|
+
return None
|
|
981
|
+
|
|
982
|
+
def _resolve_uniform_tool_timeout(self, config):
|
|
983
|
+
"""Return a single timeout to wrap every tool with, or ``None``.
|
|
984
|
+
|
|
985
|
+
A uniform value exists when the CLI sets ``tool_timeout`` (applies to all
|
|
986
|
+
agents), or when *every* agent/role declares ``tool_timeout`` and they
|
|
987
|
+
all declare the *same* value. If any agent omits ``tool_timeout``, or
|
|
988
|
+
declared values differ, returns ``None`` so the shared dict stays
|
|
989
|
+
unwrapped and the per-agent resolver becomes the sole guard — this
|
|
990
|
+
avoids both the old "tightest wins for everyone" downgrade and forcing a
|
|
991
|
+
lone declared budget onto agents that never asked for one (greptile P1).
|
|
992
|
+
"""
|
|
993
|
+
cli_timeout = (self.cli_config or {}).get("tool_timeout")
|
|
994
|
+
if isinstance(cli_timeout, (int, float)) and not isinstance(cli_timeout, bool):
|
|
995
|
+
return float(cli_timeout)
|
|
996
|
+
|
|
997
|
+
entities = {**(config.get("roles") or {}), **(config.get("agents") or {})}
|
|
998
|
+
if not entities:
|
|
999
|
+
return None
|
|
1000
|
+
|
|
1001
|
+
values = set()
|
|
1002
|
+
for entity in entities.values():
|
|
1003
|
+
t = self._declared_agent_timeout(entity)
|
|
1004
|
+
if t is None:
|
|
1005
|
+
# An agent without a declared budget must not inherit another
|
|
1006
|
+
# agent's timeout via the shared-dict wrap. Defer entirely to the
|
|
1007
|
+
# per-agent resolver.
|
|
1008
|
+
return None
|
|
1009
|
+
values.add(t)
|
|
1010
|
+
if len(values) == 1:
|
|
1011
|
+
return next(iter(values))
|
|
1012
|
+
return None
|
|
1013
|
+
|
|
1014
|
+
def resolve_agent_tool_timeout(self, agent_key, config):
|
|
1015
|
+
"""Per-agent effective timeout: agent value > CLI value > ``None``.
|
|
1016
|
+
|
|
1017
|
+
Never downgrades across agents — each agent gets its own declared budget
|
|
1018
|
+
(or the CLI default, or nothing).
|
|
1019
|
+
"""
|
|
1020
|
+
entities = {**(config.get("roles") or {}), **(config.get("agents") or {})}
|
|
1021
|
+
val = self._declared_agent_timeout(entities.get(agent_key) or {})
|
|
1022
|
+
if val is not None:
|
|
1023
|
+
return val
|
|
1024
|
+
cli_timeout = (self.cli_config or {}).get("tool_timeout")
|
|
1025
|
+
if isinstance(cli_timeout, (int, float)) and not isinstance(cli_timeout, bool):
|
|
1026
|
+
return float(cli_timeout)
|
|
1027
|
+
return None
|
|
1028
|
+
|
|
1029
|
+
def make_agent_tool_wrap_resolver(self, config):
|
|
1030
|
+
"""Return ``resolver(agent_key) -> wrap|None`` for heterogeneous budgets.
|
|
1031
|
+
|
|
1032
|
+
Returns ``None`` when no agent declares a per-agent ``tool_timeout`` (so
|
|
1033
|
+
adapters skip per-agent wrapping entirely). The returned ``wrap`` closes
|
|
1034
|
+
over that agent's timeout; tool objects stay shared, only the guard
|
|
1035
|
+
closure differs per agent.
|
|
1036
|
+
"""
|
|
1037
|
+
entities = {**(config.get("roles") or {}), **(config.get("agents") or {})}
|
|
1038
|
+
declared_any = any(
|
|
1039
|
+
self._declared_agent_timeout(e) is not None for e in entities.values()
|
|
1040
|
+
)
|
|
1041
|
+
if not declared_any:
|
|
1042
|
+
return None
|
|
1043
|
+
|
|
1044
|
+
def resolver(agent_key):
|
|
1045
|
+
t = self.resolve_agent_tool_timeout(agent_key, config)
|
|
1046
|
+
if not t or t <= 0:
|
|
1047
|
+
return None
|
|
1048
|
+
return lambda tool, _sec=t: self._wrap_tool_with_timeout(tool, _sec)
|
|
1049
|
+
|
|
1050
|
+
return resolver
|
|
1051
|
+
|
|
946
1052
|
# Mirror the legacy CLI's --tool-timeout argparse default so the workflow
|
|
947
1053
|
# validation can tell an implicit default apart from a user request.
|
|
948
1054
|
_CLI_TOOL_TIMEOUT_DEFAULT = 60
|
|
@@ -1527,21 +1633,23 @@ class AgentsGenerator:
|
|
|
1527
1633
|
def safe_format(template, **kwargs):
|
|
1528
1634
|
"""
|
|
1529
1635
|
Safe string formatting that preserves JSON/dict literals while substituting variables.
|
|
1530
|
-
|
|
1636
|
+
|
|
1531
1637
|
This function only substitutes placeholders that look like identifiers (e.g., {topic})
|
|
1532
1638
|
while preserving JSON structures like {"level": 2}.
|
|
1533
|
-
|
|
1639
|
+
|
|
1640
|
+
Delegates to the single source of truth,
|
|
1641
|
+
``BaseFrameworkAdapter._format_template`` in the core SDK, so the wrapper
|
|
1642
|
+
and core cannot drift (non-string short-circuit, regex, missing-key
|
|
1643
|
+
handling). ``_format_template`` is stateless; a fresh instance is free.
|
|
1644
|
+
|
|
1534
1645
|
Args:
|
|
1535
1646
|
template (str): Template string with placeholders
|
|
1536
1647
|
**kwargs: Values to substitute
|
|
1537
|
-
|
|
1648
|
+
|
|
1538
1649
|
Returns:
|
|
1539
1650
|
str: Formatted string with safe substitutions
|
|
1540
1651
|
"""
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
# Only replace placeholders that look like identifiers
|
|
1547
|
-
return re.sub(r'\{([a-zA-Z_][a-zA-Z0-9_]*)\}', replace_placeholder, template)
|
|
1652
|
+
from praisonaiagents.frameworks.base import BaseFrameworkAdapter
|
|
1653
|
+
return BaseFrameworkAdapter._format_template(
|
|
1654
|
+
BaseFrameworkAdapter(), template, **kwargs
|
|
1655
|
+
)
|
|
@@ -311,9 +311,17 @@ def resolve_session_agent(agent_id: str, session_id: Optional[str]) -> Any:
|
|
|
311
311
|
return agent
|
|
312
312
|
|
|
313
313
|
|
|
314
|
+
# Fields whose swap requires side-effects the core SDK owns and the wrapper
|
|
315
|
+
# must not open-code: a bare ``setattr(agent, 'llm', value)`` leaves the cached
|
|
316
|
+
# ``_llm_instance`` / ``_unified_dispatcher`` / ``_llm_init_params`` bound to the
|
|
317
|
+
# previous model, so the request keeps running on the OLD LLM while ``agent.llm``
|
|
318
|
+
# (and the response metadata) reports the new one. Route through the SDK's own
|
|
319
|
+
# invalidator instead (praisonaiagents.Agent._apply_default_llm).
|
|
320
|
+
_SIDE_EFFECT_OVERRIDES = frozenset({"llm"})
|
|
321
|
+
|
|
314
322
|
_APPLYABLE_OVERRIDES = frozenset({
|
|
315
323
|
"instructions", "goal", "role", "backstory",
|
|
316
|
-
"
|
|
324
|
+
"max_iter",
|
|
317
325
|
"verbose", "markdown",
|
|
318
326
|
})
|
|
319
327
|
|
|
@@ -322,6 +330,46 @@ class AgentConfigError(ValueError):
|
|
|
322
330
|
"""Raised when an agent_config override is unsupported or cannot be applied."""
|
|
323
331
|
|
|
324
332
|
|
|
333
|
+
def _swap_llm(agent: Any, model: Any) -> None:
|
|
334
|
+
"""Swap the agent's model, invalidating the SDK's cached LLM state.
|
|
335
|
+
|
|
336
|
+
Prefers the SDK's own ``_apply_default_llm`` (which drops ``_llm_instance``,
|
|
337
|
+
``_unified_dispatcher`` and re-seeds ``_llm_init_params`` atomically). That
|
|
338
|
+
method self-guards when the agent explicitly chose a model *or* was built
|
|
339
|
+
with a panel descriptor, so both guards are temporarily cleared — an API
|
|
340
|
+
override IS an explicit choice that supersedes a panel selection. Without
|
|
341
|
+
clearing ``_panel_descriptor`` the SDK returns early and the request would
|
|
342
|
+
silently continue on the panel model. Falls back to mirroring the SDK's
|
|
343
|
+
invalidation contract when the method is absent.
|
|
344
|
+
"""
|
|
345
|
+
apply = getattr(agent, "_apply_default_llm", None)
|
|
346
|
+
if callable(apply):
|
|
347
|
+
had_explicit = getattr(agent, "_llm_explicit", None)
|
|
348
|
+
had_panel = getattr(agent, "_panel_descriptor", None)
|
|
349
|
+
agent._llm_explicit = False
|
|
350
|
+
if had_panel is not None:
|
|
351
|
+
agent._panel_descriptor = None
|
|
352
|
+
try:
|
|
353
|
+
apply(model)
|
|
354
|
+
finally:
|
|
355
|
+
if had_explicit is not None:
|
|
356
|
+
agent._llm_explicit = had_explicit
|
|
357
|
+
# ``_panel_descriptor`` is intentionally NOT restored: the override
|
|
358
|
+
# replaces the panel selection for the lifetime of this isolated
|
|
359
|
+
# clone. Restoring it would let ``_ensure_llm_instance`` rebuild the
|
|
360
|
+
# panel LLM and drift back to the old model.
|
|
361
|
+
return
|
|
362
|
+
# Fallback: mirror the SDK invalidation contract manually.
|
|
363
|
+
agent.llm = model
|
|
364
|
+
if getattr(agent, "_panel_descriptor", None) is not None:
|
|
365
|
+
agent._panel_descriptor = None
|
|
366
|
+
for attr in ("_llm_instance", "_unified_dispatcher"):
|
|
367
|
+
if hasattr(agent, attr):
|
|
368
|
+
setattr(agent, attr, None)
|
|
369
|
+
if getattr(agent, "_llm_init_params", None):
|
|
370
|
+
agent._llm_init_params = {**agent._llm_init_params, "model": model}
|
|
371
|
+
|
|
372
|
+
|
|
325
373
|
def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> None:
|
|
326
374
|
"""Apply per-request overrides to an isolated agent clone.
|
|
327
375
|
|
|
@@ -333,6 +381,10 @@ def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> N
|
|
|
333
381
|
the shared-instance fallback): writing overrides onto a registry-shared
|
|
334
382
|
object would leak this request's config into subsequent/concurrent requests.
|
|
335
383
|
In that case the override is rejected rather than silently applied globally.
|
|
384
|
+
|
|
385
|
+
``llm`` is a side-effecting swap routed through :func:`_swap_llm` so the
|
|
386
|
+
cached LLM is invalidated — a plain ``setattr`` would leave the request
|
|
387
|
+
running on the previously cached model.
|
|
336
388
|
"""
|
|
337
389
|
if not agent_config:
|
|
338
390
|
return
|
|
@@ -342,13 +394,18 @@ def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> N
|
|
|
342
394
|
"agent is shared across requests and cannot be safely overridden "
|
|
343
395
|
"per request."
|
|
344
396
|
)
|
|
345
|
-
|
|
397
|
+
allowed = _APPLYABLE_OVERRIDES | _SIDE_EFFECT_OVERRIDES
|
|
398
|
+
unknown = set(agent_config) - allowed
|
|
346
399
|
if unknown:
|
|
347
400
|
raise AgentConfigError(
|
|
348
401
|
f"Unsupported agent_config override(s): {sorted(unknown)}. "
|
|
349
|
-
f"Allowed: {sorted(
|
|
402
|
+
f"Allowed: {sorted(allowed)}"
|
|
350
403
|
)
|
|
404
|
+
if "llm" in agent_config:
|
|
405
|
+
_swap_llm(agent, agent_config["llm"])
|
|
351
406
|
for key, value in agent_config.items():
|
|
407
|
+
if key in _SIDE_EFFECT_OVERRIDES:
|
|
408
|
+
continue
|
|
352
409
|
if not hasattr(agent, key):
|
|
353
410
|
raise AgentConfigError(
|
|
354
411
|
f"Agent has no attribute {key!r}; cannot override."
|