PraisonAI 4.7.0__tar.gz → 4.7.1__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.1}/PKG-INFO +9 -9
- {praisonai-4.7.0 → praisonai-4.7.1}/PraisonAI.egg-info/PKG-INFO +9 -9
- {praisonai-4.7.0 → praisonai-4.7.1}/PraisonAI.egg-info/requires.txt +8 -8
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_async_bridge.py +31 -8
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_lazy_cache.py +9 -5
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/agents_generator.py +12 -10
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/api/call.py +138 -50
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/_shim.py +49 -14
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/db/adapter.py +6 -6
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/praisonai_adapter.py +25 -14
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/bridges/schedules_runner.py +14 -2
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/base.py +30 -16
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/async_mongodb.py +157 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/dynamodb.py +96 -23
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/firestore.py +43 -21
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/serve.py +73 -21
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/security/audit.py +26 -0
- praisonai-4.7.1/praisonai/version.py +1 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/pyproject.toml +8 -8
- praisonai-4.7.0/praisonai/version.py +0 -1
- {praisonai-4.7.0 → praisonai-4.7.1}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/README.md +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/__main__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_api_auth.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/docs_generator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/generator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/python_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/rust_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/topic_normalizer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_dev/parity/typescript_extractor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_entrypoint.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_logging.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/acp/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/acp/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/acp/session.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/api/agent_invoke.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/app/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/app/agentos.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/auto.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/guardrails.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/branding.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/_profiling.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/managed.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/schedule.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/standardise.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/background.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/sandbox_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/interactive/async_tui.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/interactive/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/interactive/events.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/direct_prompt.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/interactive_legacy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/legacy/workflow_commands.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/main.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/config/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/config/agents.schema.json +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/config/schema.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/config/validator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/history_store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/queue.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/setup.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/db/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/flow/client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/flow/converter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/_config_builder.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/autogen_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/framework_adapters/workflow_framework.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/inc/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/inc/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integration/pages/workflow_runs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/_cli_loaders.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/_unified_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/_sync_base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute/tenki.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/compute_managed_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/jobs/executor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/jobs/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/jobs/router.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/jobs/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/jobs/store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/llm/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/llm/env.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/llm/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/n8n/client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/observability/hooks.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/_valkey_client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/_ops.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/orchestrator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/tests/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/tests/test_all_backends.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/profiler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/push/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/push/client.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/push/transports.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/core.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/history.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/security.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/recipe/server.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/applier.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/judge.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/plan.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/player.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/reader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/storage.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/replay/writer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/_base_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/_delivery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/async_agent_scheduler.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/run_policy.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/security/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/security/injection.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/security/protected.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/setup/build.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/setup.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/enhanced_templates.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/manifest.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/_tool_sources.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/cache.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/loader.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/security.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tool_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tools/audio.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tools/multiedit.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/train/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/train.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/train_vision.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui/context.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_dashboard/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/praisonai/upload_vision.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/setup.cfg +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_approval_system.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_basic.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_cli_features.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_recipe.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_registry.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_runner.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/tests/test_sandboxed_agent_compatibility.py +0 -0
- {praisonai-4.7.0 → praisonai-4.7.1}/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.1
|
|
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.1
|
|
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.1
|
|
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.1
|
|
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,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.1
|
|
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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -1527,21 +1527,23 @@ class AgentsGenerator:
|
|
|
1527
1527
|
def safe_format(template, **kwargs):
|
|
1528
1528
|
"""
|
|
1529
1529
|
Safe string formatting that preserves JSON/dict literals while substituting variables.
|
|
1530
|
-
|
|
1530
|
+
|
|
1531
1531
|
This function only substitutes placeholders that look like identifiers (e.g., {topic})
|
|
1532
1532
|
while preserving JSON structures like {"level": 2}.
|
|
1533
|
-
|
|
1533
|
+
|
|
1534
|
+
Delegates to the single source of truth,
|
|
1535
|
+
``BaseFrameworkAdapter._format_template`` in the core SDK, so the wrapper
|
|
1536
|
+
and core cannot drift (non-string short-circuit, regex, missing-key
|
|
1537
|
+
handling). ``_format_template`` is stateless; a fresh instance is free.
|
|
1538
|
+
|
|
1534
1539
|
Args:
|
|
1535
1540
|
template (str): Template string with placeholders
|
|
1536
1541
|
**kwargs: Values to substitute
|
|
1537
|
-
|
|
1542
|
+
|
|
1538
1543
|
Returns:
|
|
1539
1544
|
str: Formatted string with safe substitutions
|
|
1540
1545
|
"""
|
|
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)
|
|
1546
|
+
from praisonaiagents.frameworks.base import BaseFrameworkAdapter
|
|
1547
|
+
return BaseFrameworkAdapter._format_template(
|
|
1548
|
+
BaseFrameworkAdapter(), template, **kwargs
|
|
1549
|
+
)
|
|
@@ -4,14 +4,6 @@ import base64
|
|
|
4
4
|
import hmac
|
|
5
5
|
import secrets
|
|
6
6
|
import asyncio
|
|
7
|
-
import websockets
|
|
8
|
-
from fastapi import FastAPI, WebSocket, Request
|
|
9
|
-
from fastapi.responses import HTMLResponse
|
|
10
|
-
from fastapi.websockets import WebSocketDisconnect
|
|
11
|
-
from twilio.twiml.voice_response import VoiceResponse, Connect
|
|
12
|
-
import uvicorn
|
|
13
|
-
from pyngrok import ngrok, conf
|
|
14
|
-
from rich import print
|
|
15
7
|
import argparse
|
|
16
8
|
import logging
|
|
17
9
|
import importlib.util
|
|
@@ -19,6 +11,12 @@ import time
|
|
|
19
11
|
from typing import Optional
|
|
20
12
|
from collections import defaultdict
|
|
21
13
|
|
|
14
|
+
# Heavy, optional dependencies (websockets, fastapi, twilio, uvicorn, pyngrok,
|
|
15
|
+
# rich) are imported lazily inside the functions that need them. Importing this
|
|
16
|
+
# module must stay cheap: ``import praisonai.api.call`` (reachable from unrelated
|
|
17
|
+
# code paths) should not pay the transitive cost of the voice/serve stack or
|
|
18
|
+
# fail on minimal containers where those native deps are absent.
|
|
19
|
+
|
|
22
20
|
|
|
23
21
|
def _maybe_load_dotenv() -> None:
|
|
24
22
|
"""Load a ``.env`` file only when explicitly opted in.
|
|
@@ -170,25 +168,16 @@ def _refresh_env_globals() -> None:
|
|
|
170
168
|
pass
|
|
171
169
|
|
|
172
170
|
|
|
173
|
-
app = FastAPI()
|
|
174
|
-
|
|
175
171
|
# Set up logging
|
|
176
172
|
logger = logging.getLogger(__name__)
|
|
177
173
|
log_level = os.getenv("LOGLEVEL", "INFO").upper()
|
|
178
174
|
logger.handlers.clear()
|
|
179
175
|
|
|
180
|
-
#
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
app.include_router(agent_invoke_router)
|
|
184
|
-
logger.debug("Agent invoke router added for n8n integration")
|
|
185
|
-
except ImportError as e:
|
|
186
|
-
logger.warning(f"Could not load agent invoke router: {e}")
|
|
187
|
-
|
|
188
|
-
# Try to import tools from the root directory
|
|
176
|
+
# Tool registry populated only when a server verb explicitly loads local tools
|
|
177
|
+
# (see ``_load_local_tools`` / ``build_call_app``). It is NEVER populated as an
|
|
178
|
+
# import-time side effect.
|
|
189
179
|
tools = []
|
|
190
|
-
|
|
191
|
-
logger.debug(f"Tools path: {tools_path}")
|
|
180
|
+
|
|
192
181
|
|
|
193
182
|
def import_tools_from_file(file_path):
|
|
194
183
|
"""Import tools from file with PRAISONAI_ALLOW_LOCAL_TOOLS opt-in.
|
|
@@ -211,34 +200,122 @@ def import_tools_from_file(file_path):
|
|
|
211
200
|
logger.error("Failed to import tools from %s", file_path, exc_info=True)
|
|
212
201
|
raise ValueError(f"Failed to import tools from {file_path}") from e
|
|
213
202
|
|
|
214
|
-
try:
|
|
215
|
-
# Security: Require explicit opt-in for local tools loading
|
|
216
|
-
if os.environ.get("PRAISONAI_ALLOW_LOCAL_TOOLS", "").lower() != "true":
|
|
217
|
-
logger.debug("Local tools loading disabled. Set PRAISONAI_ALLOW_LOCAL_TOOLS=true to enable.")
|
|
218
|
-
custom_tools_module = None
|
|
219
|
-
elif os.path.exists(tools_path):
|
|
220
|
-
# tools.py exists in the root directory, import from file
|
|
221
|
-
custom_tools_module = import_tools_from_file(tools_path)
|
|
222
|
-
logger.debug("Successfully imported custom tools from root tools.py")
|
|
223
|
-
else:
|
|
224
|
-
logger.debug("No custom tools.py file found in the root directory")
|
|
225
|
-
custom_tools_module = None
|
|
226
203
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
204
|
+
def _load_local_tools():
|
|
205
|
+
"""Load ``./tools.py`` into the module ``tools`` registry, if opted in.
|
|
206
|
+
|
|
207
|
+
Runs user code, so it is gated behind ``PRAISONAI_ALLOW_LOCAL_TOOLS=true``
|
|
208
|
+
and only invoked by a server entry point (``build_call_app``/``main``) — never
|
|
209
|
+
at import time. Importing ``praisonai.api.call`` therefore has no filesystem
|
|
210
|
+
scan and never executes a neighbouring ``tools.py``.
|
|
211
|
+
|
|
212
|
+
Idempotent: the shared ``tools`` registry is rebuilt from scratch on each
|
|
213
|
+
call. Building the app more than once in a process (e.g. two
|
|
214
|
+
``build_call_app(load_local_tools=True)`` calls) therefore does not
|
|
215
|
+
accumulate duplicate tool definitions — which would otherwise send the same
|
|
216
|
+
tool multiple times in every realtime ``session.update`` and grow the
|
|
217
|
+
registry unbounded across builds.
|
|
218
|
+
"""
|
|
219
|
+
tools_path = os.path.join(os.getcwd(), 'tools.py')
|
|
220
|
+
logger.debug(f"Tools path: {tools_path}")
|
|
221
|
+
try:
|
|
222
|
+
if os.environ.get("PRAISONAI_ALLOW_LOCAL_TOOLS", "").lower() != "true":
|
|
223
|
+
logger.debug("Local tools loading disabled. Set PRAISONAI_ALLOW_LOCAL_TOOLS=true to enable.")
|
|
224
|
+
custom_tools_module = None
|
|
225
|
+
elif os.path.exists(tools_path):
|
|
226
|
+
custom_tools_module = import_tools_from_file(tools_path)
|
|
227
|
+
logger.debug("Successfully imported custom tools from root tools.py")
|
|
231
228
|
else:
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
229
|
+
logger.debug("No custom tools.py file found in the root directory")
|
|
230
|
+
custom_tools_module = None
|
|
231
|
+
|
|
232
|
+
if custom_tools_module:
|
|
233
|
+
# Reset in place (keep the same list object other modules may hold a
|
|
234
|
+
# reference to) so a re-load replaces rather than appends.
|
|
235
|
+
tools.clear()
|
|
236
|
+
if hasattr(custom_tools_module, 'tools') and isinstance(custom_tools_module.tools, list):
|
|
237
|
+
tools.extend(custom_tools_module.tools)
|
|
238
|
+
else:
|
|
239
|
+
for name, obj in custom_tools_module.__dict__.items():
|
|
240
|
+
if callable(obj) and not name.startswith("__"):
|
|
241
|
+
tool_definition = getattr(obj, 'definition', None)
|
|
242
|
+
if tool_definition:
|
|
243
|
+
tools.append(tool_definition)
|
|
244
|
+
except Exception as e:
|
|
245
|
+
logger.warning(f"Error importing custom tools: {str(e)}. Continuing without custom tools.")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def build_call_app(*, load_local_tools: bool = False):
|
|
249
|
+
"""Build a fresh FastAPI app with the call routes registered.
|
|
250
|
+
|
|
251
|
+
Heavy deps (FastAPI, the agent-invoke router) are imported here, not at
|
|
252
|
+
module import time. When ``load_local_tools`` is true and the env opt-in is
|
|
253
|
+
set, ``./tools.py`` is loaded into the shared ``tools`` registry.
|
|
254
|
+
"""
|
|
255
|
+
from fastapi import FastAPI
|
|
256
|
+
|
|
257
|
+
app = FastAPI()
|
|
258
|
+
|
|
259
|
+
try:
|
|
260
|
+
from .agent_invoke import router as agent_invoke_router
|
|
261
|
+
app.include_router(agent_invoke_router)
|
|
262
|
+
logger.debug("Agent invoke router added for n8n integration")
|
|
263
|
+
except ImportError as e:
|
|
264
|
+
logger.warning(f"Could not load agent invoke router: {e}")
|
|
265
|
+
|
|
266
|
+
_register_routes(app)
|
|
267
|
+
|
|
268
|
+
if load_local_tools:
|
|
269
|
+
_load_local_tools()
|
|
270
|
+
|
|
271
|
+
return app
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
_app = None
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def __getattr__(name):
|
|
278
|
+
"""Lazily construct the module-level ``app`` on first access.
|
|
279
|
+
|
|
280
|
+
Preserves the ``praisonai.api.call.app`` attribute for third parties that
|
|
281
|
+
import the name directly, without building a FastAPI app (and pulling its
|
|
282
|
+
transitive deps) merely because the module was imported.
|
|
283
|
+
"""
|
|
284
|
+
if name == "app":
|
|
285
|
+
global _app
|
|
286
|
+
if _app is None:
|
|
287
|
+
_app = build_call_app()
|
|
288
|
+
return _app
|
|
289
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _register_routes(app):
|
|
293
|
+
"""Register the voice-call HTTP/WebSocket routes on ``app``.
|
|
294
|
+
|
|
295
|
+
Handlers are defined at module scope (below) and attached here so the app is
|
|
296
|
+
built lazily by :func:`build_call_app` without any import-time app object.
|
|
297
|
+
|
|
298
|
+
The handlers are annotation-free at module scope to keep ``import
|
|
299
|
+
praisonai.api.call`` free of a top-level ``fastapi`` dependency. FastAPI
|
|
300
|
+
resolves framework objects (``Request``/``WebSocket``) by *annotation*, not
|
|
301
|
+
by parameter name, so the real classes are stamped onto the handlers here —
|
|
302
|
+
at build time, where ``fastapi`` is already imported — before registration.
|
|
303
|
+
Without this, an unannotated ``request`` parameter is treated as a required
|
|
304
|
+
query parameter and the ``/`` route 422s.
|
|
305
|
+
"""
|
|
306
|
+
from fastapi import Request, WebSocket
|
|
307
|
+
from fastapi.responses import HTMLResponse
|
|
308
|
+
|
|
309
|
+
handle_incoming_call.__annotations__["request"] = Request
|
|
310
|
+
handle_media_stream.__annotations__["websocket"] = WebSocket
|
|
311
|
+
|
|
312
|
+
app.add_api_route(
|
|
313
|
+
"/status", index_page, methods=["GET"], response_class=HTMLResponse
|
|
314
|
+
)
|
|
315
|
+
app.add_api_route("/", handle_incoming_call, methods=["GET", "POST"])
|
|
316
|
+
app.add_api_websocket_route("/media-stream", handle_media_stream)
|
|
237
317
|
|
|
238
|
-
except Exception as e:
|
|
239
|
-
logger.warning(f"Error importing custom tools: {str(e)}. Continuing without custom tools.")
|
|
240
318
|
|
|
241
|
-
@app.get("/status", response_class=HTMLResponse)
|
|
242
319
|
async def index_page():
|
|
243
320
|
return """
|
|
244
321
|
<html>
|
|
@@ -251,11 +328,13 @@ async def index_page():
|
|
|
251
328
|
</html>
|
|
252
329
|
"""
|
|
253
330
|
|
|
254
|
-
from fastapi import HTTPException, status
|
|
255
331
|
|
|
256
|
-
|
|
257
|
-
async def handle_incoming_call(request: Request):
|
|
332
|
+
async def handle_incoming_call(request):
|
|
258
333
|
"""Handle incoming call and return TwiML response to connect to Media Stream."""
|
|
334
|
+
from fastapi import HTTPException, status
|
|
335
|
+
from fastapi.responses import HTMLResponse
|
|
336
|
+
from twilio.twiml.voice_response import VoiceResponse, Connect
|
|
337
|
+
|
|
259
338
|
if not CALL_SERVER_TOKEN:
|
|
260
339
|
raise HTTPException(
|
|
261
340
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
@@ -298,9 +377,11 @@ async def handle_incoming_call(request: Request):
|
|
|
298
377
|
response.append(connect)
|
|
299
378
|
return HTMLResponse(content=str(response), media_type="application/xml")
|
|
300
379
|
|
|
301
|
-
|
|
302
|
-
async def handle_media_stream(websocket: WebSocket):
|
|
380
|
+
async def handle_media_stream(websocket):
|
|
303
381
|
"""Handle WebSocket connections between Twilio and OpenAI."""
|
|
382
|
+
import websockets
|
|
383
|
+
from fastapi.websockets import WebSocketDisconnect
|
|
384
|
+
|
|
304
385
|
global active_connections
|
|
305
386
|
|
|
306
387
|
# 1. Authentication — accept a one-shot, per-connection session token
|
|
@@ -498,6 +579,8 @@ async def send_session_update(openai_ws):
|
|
|
498
579
|
await openai_ws.send(json.dumps(session_update))
|
|
499
580
|
|
|
500
581
|
def setup_public_url(port):
|
|
582
|
+
from pyngrok import ngrok, conf
|
|
583
|
+
|
|
501
584
|
if NGROK_AUTH_TOKEN:
|
|
502
585
|
conf.get_default().auth_token = NGROK_AUTH_TOKEN
|
|
503
586
|
public_url = ngrok.connect(addr=str(port)).public_url
|
|
@@ -506,6 +589,8 @@ def setup_public_url(port):
|
|
|
506
589
|
|
|
507
590
|
def run_server(port: int, host: str = "127.0.0.1", use_public: bool = False):
|
|
508
591
|
"""Run the FastAPI server using uvicorn."""
|
|
592
|
+
import uvicorn
|
|
593
|
+
|
|
509
594
|
if not OPENAI_API_KEY:
|
|
510
595
|
raise ValueError('Missing the OpenAI API key. Please set it in the .env file or configure it through the GUI.')
|
|
511
596
|
|
|
@@ -522,6 +607,9 @@ def run_server(port: int, host: str = "127.0.0.1", use_public: bool = False):
|
|
|
522
607
|
|
|
523
608
|
os.environ["PRAISONAI_CALL_BIND_HOST"] = host
|
|
524
609
|
|
|
610
|
+
# Build the app here (server entry point) — this is the only place local
|
|
611
|
+
# tools.py is loaded, and only when PRAISONAI_ALLOW_LOCAL_TOOLS is set.
|
|
612
|
+
app = build_call_app(load_local_tools=True)
|
|
525
613
|
uvicorn.run(app, host=host, port=port, log_level="warning")
|
|
526
614
|
|
|
527
615
|
def main(args=None):
|
|
@@ -33,10 +33,14 @@ the moved package.
|
|
|
33
33
|
from __future__ import annotations
|
|
34
34
|
|
|
35
35
|
import importlib
|
|
36
|
+
import logging
|
|
37
|
+
import os
|
|
36
38
|
import pkgutil
|
|
37
39
|
import sys
|
|
38
40
|
from importlib.machinery import ModuleSpec
|
|
39
41
|
|
|
42
|
+
_logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
40
44
|
|
|
41
45
|
class _RedirectLoader:
|
|
42
46
|
"""Loader that returns an already-imported module without re-executing it."""
|
|
@@ -75,25 +79,35 @@ class _AliasFinder:
|
|
|
75
79
|
|
|
76
80
|
|
|
77
81
|
def _register_submodules(old_name: str, new_name: str, module) -> None:
|
|
78
|
-
"""
|
|
82
|
+
"""Alias the moved subtree under the old dotted name.
|
|
79
83
|
|
|
80
84
|
Registering each moved submodule under its old dotted name in
|
|
81
85
|
``sys.modules`` guarantees that a later ``import old_name.sub`` finds the
|
|
82
86
|
identical object immediately, never re-executing the file (which would
|
|
83
|
-
create duplicate class/enum objects).
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
calls ``import_module`` re-entrantly *inside* the parent's in-progress
|
|
92
|
-
import. Under the import lock that re-entrancy loads the moved file twice,
|
|
87
|
+
create duplicate class/enum objects).
|
|
88
|
+
|
|
89
|
+
Eager pre-registration is required for **correctness**, not merely startup
|
|
90
|
+
speed. If the alias for ``old_name.sub`` is *absent* when a statement such as
|
|
91
|
+
``from old_name.sub import Symbol`` (or ``import old_name.sub``) runs first,
|
|
92
|
+
CPython imports the parent shim, then resolves ``.sub`` through
|
|
93
|
+
:class:`_AliasFinder.find_spec`, which calls ``import_module`` re-entrantly.
|
|
94
|
+
Under the import lock that re-entrancy can load the moved file *twice*,
|
|
93
95
|
producing two distinct module objects (duplicate classes) and breaking
|
|
94
|
-
module identity
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
module identity — so ``old_name.sub is new_name.sub`` becomes ``False`` and
|
|
97
|
+
``unittest.mock.patch("old_name.sub.attr")`` no longer patches the object the
|
|
98
|
+
running code (importing via the new name) actually uses.
|
|
99
|
+
|
|
100
|
+
Pre-stamping ``sys.modules[old_name.sub]`` here means ``_find_and_load``
|
|
101
|
+
returns the single canonical object directly and never re-enters the finder.
|
|
102
|
+
Modules that fail to import eagerly (optional heavy deps not installed) are
|
|
103
|
+
logged and left for :class:`_AliasFinder` to resolve lazily on first use, so
|
|
104
|
+
a partial install still starts cleanly.
|
|
105
|
+
|
|
106
|
+
Set ``PRAISONAI_SHIM_LAZY=1`` to opt *out* of the eager subtree walk (pure
|
|
107
|
+
lazy resolution). This trades the module-identity guarantee above for not
|
|
108
|
+
importing the moved subtree at shim-install time; only use it when nothing in
|
|
109
|
+
the process relies on ``old_name.sub is new_name.sub`` (e.g. no ``mock.patch``
|
|
110
|
+
against the old dotted path).
|
|
97
111
|
"""
|
|
98
112
|
new_prefix = new_name + "."
|
|
99
113
|
|
|
@@ -109,6 +123,12 @@ def _register_submodules(old_name: str, new_name: str, module) -> None:
|
|
|
109
123
|
old_equiv = old_name + mod_name[len(new_name):]
|
|
110
124
|
sys.modules.setdefault(old_equiv, mod)
|
|
111
125
|
|
|
126
|
+
if os.environ.get("PRAISONAI_SHIM_LAZY", "").lower() in ("1", "true"):
|
|
127
|
+
# Explicit opt-out: rely solely on _AliasFinder for on-demand
|
|
128
|
+
# resolution. Callers choosing this must not depend on module identity
|
|
129
|
+
# across the old/new dotted paths (see docstring).
|
|
130
|
+
return
|
|
131
|
+
|
|
112
132
|
search_path = getattr(module, "__path__", None)
|
|
113
133
|
if not search_path:
|
|
114
134
|
return
|
|
@@ -120,7 +140,22 @@ def _register_submodules(old_name: str, new_name: str, module) -> None:
|
|
|
120
140
|
try:
|
|
121
141
|
sub = importlib.import_module(info.name)
|
|
122
142
|
except Exception:
|
|
143
|
+
# Do not swallow silently: a downstream AttributeError on the
|
|
144
|
+
# alias with no traceback pointing here is the opposite of
|
|
145
|
+
# "safe by default". Log and let _AliasFinder retry lazily.
|
|
146
|
+
_logger.warning(
|
|
147
|
+
"shim: eager import of %s failed; will be resolved lazily",
|
|
148
|
+
info.name,
|
|
149
|
+
exc_info=True,
|
|
150
|
+
)
|
|
123
151
|
continue
|
|
152
|
+
# ``sys.modules[info.name]`` may be a ``None`` placeholder (CPython
|
|
153
|
+
# records known-absent submodules that way). Aliasing one would poison
|
|
154
|
+
# the old dotted name so ``import old_name.sub`` raises "None in
|
|
155
|
+
# sys.modules" before _AliasFinder can resolve it lazily — mirror the
|
|
156
|
+
# guard in the already-imported pass above.
|
|
157
|
+
if sub is None:
|
|
158
|
+
continue
|
|
124
159
|
old_equiv = old_name + info.name[len(new_name):]
|
|
125
160
|
sys.modules.setdefault(old_equiv, sub)
|
|
126
161
|
|
|
@@ -889,7 +889,7 @@ class PraisonAIDB:
|
|
|
889
889
|
await self._dispatch_async(
|
|
890
890
|
self._state_store,
|
|
891
891
|
"set",
|
|
892
|
-
"
|
|
892
|
+
"async_set",
|
|
893
893
|
f"agent:{session_id}",
|
|
894
894
|
{
|
|
895
895
|
"agent_name": agent_name,
|
|
@@ -1039,7 +1039,7 @@ class PraisonAIDB:
|
|
|
1039
1039
|
# instead of overwriting it with a disconnected "ended" record.
|
|
1040
1040
|
agent_key = f"agent:{session_id}"
|
|
1041
1041
|
agent_data = await self._dispatch_async(
|
|
1042
|
-
self._state_store, "get", "
|
|
1042
|
+
self._state_store, "get", "async_get", agent_key
|
|
1043
1043
|
) or {}
|
|
1044
1044
|
agent_data.update({
|
|
1045
1045
|
"status": "ended",
|
|
@@ -1047,7 +1047,7 @@ class PraisonAIDB:
|
|
|
1047
1047
|
"metadata": {**agent_data.get("metadata", {}), **(metadata or {})},
|
|
1048
1048
|
})
|
|
1049
1049
|
await self._dispatch_async(
|
|
1050
|
-
self._state_store, "set", "
|
|
1050
|
+
self._state_store, "set", "async_set", agent_key, agent_data
|
|
1051
1051
|
)
|
|
1052
1052
|
|
|
1053
1053
|
async def aon_run_start(
|
|
@@ -1065,7 +1065,7 @@ class PraisonAIDB:
|
|
|
1065
1065
|
await self._dispatch_async(
|
|
1066
1066
|
self._state_store,
|
|
1067
1067
|
"set",
|
|
1068
|
-
"
|
|
1068
|
+
"async_set",
|
|
1069
1069
|
run_key,
|
|
1070
1070
|
{
|
|
1071
1071
|
"run_id": run_id,
|
|
@@ -1092,7 +1092,7 @@ class PraisonAIDB:
|
|
|
1092
1092
|
if self._state_store:
|
|
1093
1093
|
run_key = f"run:{session_id}:{run_id}"
|
|
1094
1094
|
run_data = await self._dispatch_async(
|
|
1095
|
-
self._state_store, "get", "
|
|
1095
|
+
self._state_store, "get", "async_get", run_key
|
|
1096
1096
|
) or {}
|
|
1097
1097
|
run_data.update({
|
|
1098
1098
|
"ended_at": time.time(),
|
|
@@ -1102,7 +1102,7 @@ class PraisonAIDB:
|
|
|
1102
1102
|
"metadata": {**run_data.get("metadata", {}), **(metadata or {})},
|
|
1103
1103
|
})
|
|
1104
1104
|
await self._dispatch_async(
|
|
1105
|
-
self._state_store, "set", "
|
|
1105
|
+
self._state_store, "set", "async_set", run_key, run_data
|
|
1106
1106
|
)
|
|
1107
1107
|
|
|
1108
1108
|
async def aclose(self) -> None:
|