PraisonAI 4.7.8__tar.gz → 4.7.9__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.8 → praisonai-4.7.9}/PKG-INFO +11 -9
- {praisonai-4.7.8 → praisonai-4.7.9}/PraisonAI.egg-info/PKG-INFO +11 -9
- {praisonai-4.7.8 → praisonai-4.7.9}/PraisonAI.egg-info/requires.txt +10 -8
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/agents_generator.py +33 -11
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/api/agent_invoke.py +93 -44
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/passthrough.py +101 -21
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/langfuse_client.py +18 -1
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/registry.py +23 -1
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/workflow_framework.py +10 -3
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/jobs/executor.py +55 -15
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/jobs/models.py +1 -1
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/jobs/router.py +7 -1
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/history.py +132 -37
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/operations.py +39 -15
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/run_policy.py +10 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/yaml_loader.py +5 -2
- praisonai-4.7.9/praisonai/version.py +1 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/pyproject.toml +19 -8
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_n8n_agent_invoke.py +278 -0
- praisonai-4.7.8/praisonai/version.py +0 -1
- {praisonai-4.7.8 → praisonai-4.7.9}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/README.md +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/__main__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_api_auth.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_async_bridge.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_entrypoint.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_lazy_cache.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_logging.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/acp/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/acp/server.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/acp/session.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/agent.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/api/call.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/app/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/app/agentos.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/auto.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/guardrails.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/_shim.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/branding.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/_profiling.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/managed.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/schedule.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/standardise.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/background.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/sandbox_cli.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/interactive/async_tui.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/interactive/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/interactive/events.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/direct_prompt.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/interactive_legacy.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/legacy/workflow_commands.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/main.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/config/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/config/agents.schema.json +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/config/schema.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/config/validator.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/history_store.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/queue.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/setup.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/db/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/db/adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/flow/client.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/flow/converter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/_config_builder.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/autogen_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/inc/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/inc/models.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/bridges/schedules_runner.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integration/pages/workflow_runs.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/_cli_loaders.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/_sync_base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute/tenki.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/compute_managed_agent.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/jobs/server.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/jobs/store.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/llm/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/llm/env.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/llm/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/n8n/client.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/observability/hooks.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/_valkey_client.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/_ops.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/orchestrator.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/profiler.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/push/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/push/client.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/push/transports.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/core.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/models.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/security.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/serve.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/recipe/server.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/applier.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/judge.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/plan.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/player.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/reader.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/storage.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/replay/writer.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/_base_scheduler.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/_delivery.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/async_agent_scheduler.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/security/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/security/audit.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/security/injection.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/security/protected.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/setup/build.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/setup.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/models.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/_tool_sources.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/cache.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/loader.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/security.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tool_registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tools/audio.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tools/multiedit.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/train/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/train.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/train_vision.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui/context.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_dashboard/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/praisonai/upload_vision.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/setup.cfg +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_approval_system.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_basic.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_cli_features.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_recipe.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_registry.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_runner.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/tests/test_sandboxed_agent_compatibility.py +0 -0
- {praisonai-4.7.8 → praisonai-4.7.9}/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.9
|
|
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.7
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.6
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.6
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.6
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.6
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.8
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.6
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.6
|
|
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
|
|
@@ -140,6 +140,8 @@ Requires-Dist: agent-client-protocol>=0.7.0; extra == "acp"
|
|
|
140
140
|
Provides-Extra: flow
|
|
141
141
|
Requires-Dist: langflow>=1.0.0; extra == "flow"
|
|
142
142
|
Requires-Dist: requests>=2.31.0; extra == "flow"
|
|
143
|
+
Requires-Dist: a2a-sdk[http-server]>=1.0.0; extra == "flow"
|
|
144
|
+
Requires-Dist: fastapi-pagination>=0.12.34; extra == "flow"
|
|
143
145
|
Provides-Extra: lite
|
|
144
146
|
Provides-Extra: all
|
|
145
147
|
Requires-Dist: fastapi>=0.115.0; extra == "all"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 4.7.
|
|
3
|
+
Version: 4.7.9
|
|
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.7
|
|
15
|
+
Requires-Dist: praisonai-code>=0.1.6
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.1.6
|
|
17
|
+
Requires-Dist: praisonai-train>=0.1.6
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.1.6
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.1.8
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.1.6
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.1.6
|
|
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
|
|
@@ -140,6 +140,8 @@ Requires-Dist: agent-client-protocol>=0.7.0; extra == "acp"
|
|
|
140
140
|
Provides-Extra: flow
|
|
141
141
|
Requires-Dist: langflow>=1.0.0; extra == "flow"
|
|
142
142
|
Requires-Dist: requests>=2.31.0; extra == "flow"
|
|
143
|
+
Requires-Dist: a2a-sdk[http-server]>=1.0.0; extra == "flow"
|
|
144
|
+
Requires-Dist: fastapi-pagination>=0.12.34; extra == "flow"
|
|
143
145
|
Provides-Extra: lite
|
|
144
146
|
Provides-Extra: all
|
|
145
147
|
Requires-Dist: fastapi>=0.115.0; extra == "all"
|
|
@@ -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.7
|
|
5
|
+
praisonai-code>=0.1.6
|
|
6
|
+
praisonai-bot>=0.1.6
|
|
7
|
+
praisonai-train>=0.1.6
|
|
8
|
+
praisonai-browser>=0.1.6
|
|
9
|
+
praisonai-mcp>=0.1.8
|
|
10
|
+
praisonai-sandbox>=0.1.6
|
|
11
|
+
praisonai-deploy>=0.1.6
|
|
12
12
|
python-dotenv>=0.19.0
|
|
13
13
|
litellm<2,>=1.83.14
|
|
14
14
|
PyYAML>=6.0
|
|
@@ -153,6 +153,8 @@ praisonai-sandbox[e2b]
|
|
|
153
153
|
[flow]
|
|
154
154
|
langflow>=1.0.0
|
|
155
155
|
requests>=2.31.0
|
|
156
|
+
a2a-sdk[http-server]>=1.0.0
|
|
157
|
+
fastapi-pagination>=0.12.34
|
|
156
158
|
|
|
157
159
|
[gateway]
|
|
158
160
|
praisonai-bot[gateway]
|
|
@@ -844,8 +844,11 @@ class AgentsGenerator:
|
|
|
844
844
|
# Build tools dictionary using shared logic
|
|
845
845
|
tools_dict = self._build_tools_dict(config)
|
|
846
846
|
|
|
847
|
-
# Select framework and resolve adapter variant
|
|
848
|
-
|
|
847
|
+
# Select framework and resolve adapter variant. Registry is the single
|
|
848
|
+
# source of truth for the default, so no literal framework name here.
|
|
849
|
+
framework_name = self._adapter_registry.resolve_or_default(
|
|
850
|
+
self.framework or config.get('framework')
|
|
851
|
+
)
|
|
849
852
|
adapter = self._select_framework(framework_name, config)
|
|
850
853
|
|
|
851
854
|
# Validate framework availability through the injected registry so a
|
|
@@ -1376,10 +1379,13 @@ class AgentsGenerator:
|
|
|
1376
1379
|
if self._is_workflow_yaml(config):
|
|
1377
1380
|
# Bracket the workflow run in the same observability session the
|
|
1378
1381
|
# sequential/hierarchical path uses so AgentOps init/finalize fires
|
|
1379
|
-
# for workflow YAMLs too.
|
|
1380
|
-
#
|
|
1382
|
+
# for workflow YAMLs too. Tag with the config-resolved framework
|
|
1383
|
+
# (registry default when omitted) rather than a hardcoded name.
|
|
1381
1384
|
self._validate_workflow_cli_capabilities()
|
|
1382
|
-
|
|
1385
|
+
workflow_label = self._adapter_registry.resolve_or_default(
|
|
1386
|
+
self.framework or config.get('framework')
|
|
1387
|
+
).lower()
|
|
1388
|
+
with observability_session(workflow_label):
|
|
1383
1389
|
return self._run_yaml_workflow(config)
|
|
1384
1390
|
|
|
1385
1391
|
# Use shared preparation logic
|
|
@@ -1432,10 +1438,14 @@ class AgentsGenerator:
|
|
|
1432
1438
|
if self._is_workflow_yaml(config):
|
|
1433
1439
|
# Bracket the async workflow run in the same observability session
|
|
1434
1440
|
# the sequential/hierarchical path uses so AgentOps init/finalize
|
|
1435
|
-
# fires for workflow YAMLs too.
|
|
1436
|
-
#
|
|
1441
|
+
# fires for workflow YAMLs too. Tag with the config-resolved
|
|
1442
|
+
# framework (registry default when omitted) rather than a hardcoded
|
|
1443
|
+
# name.
|
|
1437
1444
|
self._validate_workflow_cli_capabilities()
|
|
1438
|
-
|
|
1445
|
+
workflow_label = self._adapter_registry.resolve_or_default(
|
|
1446
|
+
self.framework or config.get('framework')
|
|
1447
|
+
).lower()
|
|
1448
|
+
with observability_session(workflow_label):
|
|
1439
1449
|
return await self._arun_yaml_workflow(config)
|
|
1440
1450
|
|
|
1441
1451
|
# Use shared preparation logic (off the event loop to avoid blocking imports)
|
|
@@ -1493,23 +1503,35 @@ class AgentsGenerator:
|
|
|
1493
1503
|
)
|
|
1494
1504
|
# Validate the YAML-declared framework first so a non-native workflow
|
|
1495
1505
|
# YAML (e.g. framework: crewai) can't slip through just because the
|
|
1496
|
-
# generator instance still holds the default 'praisonai'.
|
|
1497
|
-
|
|
1506
|
+
# generator instance still holds the default 'praisonai'. Resolve
|
|
1507
|
+
# through the injected registry (not the process default) so the
|
|
1508
|
+
# build-time framework agrees with the observability label and a
|
|
1509
|
+
# tenant-scoped adapter is honoured. Fall back to the process default
|
|
1510
|
+
# when the instance was built without an injected registry.
|
|
1511
|
+
registry = getattr(self, "_adapter_registry", None) or _get_default_adapter_registry()
|
|
1512
|
+
workflow_framework = framework_from_config(
|
|
1513
|
+
config, registry=registry
|
|
1514
|
+
)
|
|
1498
1515
|
validate_workflow_framework(
|
|
1499
1516
|
workflow_framework,
|
|
1500
1517
|
source="agents.yaml workflow section",
|
|
1518
|
+
registry=registry,
|
|
1501
1519
|
)
|
|
1502
1520
|
if self.framework:
|
|
1503
1521
|
validate_workflow_framework(
|
|
1504
1522
|
self.framework,
|
|
1505
1523
|
source="AgentsGenerator framework",
|
|
1524
|
+
registry=registry,
|
|
1506
1525
|
)
|
|
1507
1526
|
|
|
1508
1527
|
# Parity with the sequential/hierarchical path: reject an incompatible
|
|
1509
1528
|
# cli_backend in a workflow YAML at build time instead of accepting it
|
|
1510
1529
|
# silently. Workflow YAMLs are native-only, so validate against
|
|
1511
1530
|
# 'praisonai'.
|
|
1512
|
-
self._validate_cli_backend_compatibility(
|
|
1531
|
+
self._validate_cli_backend_compatibility(
|
|
1532
|
+
config,
|
|
1533
|
+
registry.resolve_or_default(workflow_framework),
|
|
1534
|
+
)
|
|
1513
1535
|
|
|
1514
1536
|
# The framework-level check above passes for 'praisonai' because the
|
|
1515
1537
|
# sequential/hierarchical adapter does support cli_backend — but
|
|
@@ -443,6 +443,42 @@ def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> N
|
|
|
443
443
|
)
|
|
444
444
|
|
|
445
445
|
|
|
446
|
+
async def _safe_close_agent(agent: Any) -> None:
|
|
447
|
+
"""Best-effort teardown of a per-request agent clone.
|
|
448
|
+
|
|
449
|
+
``resolve_session_agent`` returns a fresh clone for every invoke of a
|
|
450
|
+
session-isolatable ``Agent`` (so concurrent callers never share
|
|
451
|
+
``chat_history``). Those clones lazily spin up LLM client pools,
|
|
452
|
+
tool-executor threads and MCP subprocesses that
|
|
453
|
+
``Agent.close()``/``aclose()`` release — without this teardown each request
|
|
454
|
+
leaks them into the long-lived server process.
|
|
455
|
+
|
|
456
|
+
Only a *clone* is closed. Ownership is derived from the agent itself via
|
|
457
|
+
:func:`_supports_session_isolation`: an isolatable agent was cloned for this
|
|
458
|
+
request and is safe to close, whereas a non-isolatable one (plain mock /
|
|
459
|
+
lightweight callable) is the shared registry instance and must NOT be closed
|
|
460
|
+
or the next request would run against a torn-down agent. Deriving ownership
|
|
461
|
+
from the resolved object — rather than comparing it against a second,
|
|
462
|
+
independently-timed registry lookup — is race-free even when the registry
|
|
463
|
+
entry is concurrently replaced.
|
|
464
|
+
|
|
465
|
+
Errors are swallowed (logged) so cleanup never masks a successful response.
|
|
466
|
+
"""
|
|
467
|
+
if agent is None or not _supports_session_isolation(agent):
|
|
468
|
+
return
|
|
469
|
+
try:
|
|
470
|
+
aclose = getattr(agent, "aclose", None)
|
|
471
|
+
if inspect.iscoroutinefunction(aclose):
|
|
472
|
+
await aclose()
|
|
473
|
+
else:
|
|
474
|
+
close = getattr(agent, "close", None)
|
|
475
|
+
if callable(close):
|
|
476
|
+
import asyncio
|
|
477
|
+
await asyncio.to_thread(close)
|
|
478
|
+
except Exception:
|
|
479
|
+
logger.exception("Agent cleanup failed")
|
|
480
|
+
|
|
481
|
+
|
|
446
482
|
def _supports_async_start(agent: Any) -> bool:
|
|
447
483
|
"""Return True if agent.astart is a coroutine function."""
|
|
448
484
|
astart = getattr(agent, "astart", None)
|
|
@@ -511,52 +547,60 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
|
|
|
511
547
|
status_code=404,
|
|
512
548
|
detail=f"Agent '{agent_id}' not found"
|
|
513
549
|
)
|
|
514
|
-
|
|
515
|
-
# Apply per-request agent_config overrides to the isolated clone, or
|
|
516
|
-
# reject unsupported keys with a 400 so the caller isn't silently
|
|
517
|
-
# running a different config than they asked for.
|
|
518
|
-
try:
|
|
519
|
-
_apply_agent_config(agent, request.agent_config)
|
|
520
|
-
except AgentConfigError as e:
|
|
521
|
-
raise HTTPException(status_code=400, detail=str(e))
|
|
522
550
|
|
|
523
551
|
try:
|
|
524
|
-
#
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
#
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
"agent_id"
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
552
|
+
# Apply per-request agent_config overrides to the isolated clone, or
|
|
553
|
+
# reject unsupported keys with a 400 so the caller isn't silently
|
|
554
|
+
# running a different config than they asked for.
|
|
555
|
+
try:
|
|
556
|
+
_apply_agent_config(agent, request.agent_config)
|
|
557
|
+
except AgentConfigError as e:
|
|
558
|
+
raise HTTPException(status_code=400, detail=str(e))
|
|
559
|
+
|
|
560
|
+
try:
|
|
561
|
+
# Session ID echoed back to the caller
|
|
562
|
+
session_id = request.session_id or "default"
|
|
563
|
+
|
|
564
|
+
# Invoke agent (handle both sync and async agents)
|
|
565
|
+
if _supports_async_start(agent):
|
|
566
|
+
# Async agent
|
|
567
|
+
result = await agent.astart(request.message)
|
|
568
|
+
elif _supports_sync_start(agent):
|
|
569
|
+
# Sync agent - run in a worker thread to avoid blocking the event
|
|
570
|
+
# loop. ``asyncio.to_thread`` is the correct primitive inside a
|
|
571
|
+
# running request coroutine (``get_event_loop()`` is deprecated
|
|
572
|
+
# there since Python 3.10).
|
|
573
|
+
import asyncio
|
|
574
|
+
result = await asyncio.to_thread(agent.start, request.message)
|
|
575
|
+
else:
|
|
576
|
+
raise AttributeError(f"Agent {agent_id} must provide start() or async astart()")
|
|
577
|
+
|
|
578
|
+
logger.info(f"Agent {agent_id} invoked successfully")
|
|
579
|
+
|
|
580
|
+
return AgentInvokeResponse(
|
|
581
|
+
result=str(result),
|
|
582
|
+
session_id=session_id,
|
|
583
|
+
status="success",
|
|
584
|
+
metadata={
|
|
585
|
+
"agent_id": agent_id,
|
|
586
|
+
"message_length": len(request.message),
|
|
587
|
+
"response_length": len(str(result))
|
|
588
|
+
}
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
except HTTPException:
|
|
592
|
+
raise
|
|
593
|
+
except Exception as e:
|
|
594
|
+
logger.error(f"Agent {agent_id} invocation failed: {e}")
|
|
595
|
+
raise HTTPException(
|
|
596
|
+
status_code=500,
|
|
597
|
+
detail=f"Agent execution failed: {str(e)}"
|
|
598
|
+
)
|
|
599
|
+
finally:
|
|
600
|
+
# Release the per-request clone's resources (LLM pools, tool-executor
|
|
601
|
+
# threads, MCP subprocesses). No-op when the agent fell back to the
|
|
602
|
+
# shared template. Never masks the response.
|
|
603
|
+
await _safe_close_agent(agent)
|
|
560
604
|
|
|
561
605
|
@router.get("/agents")
|
|
562
606
|
async def list_agents(
|
|
@@ -669,6 +713,7 @@ async def invoke_agent_standalone(
|
|
|
669
713
|
"available_agents": list_registered_agents()
|
|
670
714
|
}
|
|
671
715
|
|
|
716
|
+
agent = None
|
|
672
717
|
try:
|
|
673
718
|
# Per-session isolated agent view (see resolve_session_agent). Done
|
|
674
719
|
# inside the try so a clone/isolation failure returns a clean error
|
|
@@ -715,6 +760,10 @@ async def invoke_agent_standalone(
|
|
|
715
760
|
"status": "error",
|
|
716
761
|
"agent_id": agent_id
|
|
717
762
|
}
|
|
763
|
+
finally:
|
|
764
|
+
# Release the per-request clone's resources; no-op for the shared
|
|
765
|
+
# template fallback. Never masks the response.
|
|
766
|
+
await _safe_close_agent(agent)
|
|
718
767
|
|
|
719
768
|
|
|
720
769
|
# Example usage and helper functions
|
|
@@ -7,7 +7,91 @@ Provides generic API passthrough functionality for provider-specific endpoints.
|
|
|
7
7
|
from dataclasses import dataclass, field
|
|
8
8
|
from typing import Optional, Any, Dict
|
|
9
9
|
from urllib.parse import urlparse
|
|
10
|
+
import asyncio
|
|
10
11
|
import ipaddress
|
|
12
|
+
import threading
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Shared HTTP clients for the httpx fallback path (used when litellm's
|
|
16
|
+
# passthrough route is unavailable). Reused across calls so the hot passthrough
|
|
17
|
+
# fallback shares a keep-alive connection pool instead of opening + tearing down
|
|
18
|
+
# a socket per agent call. Timeout is applied per-request, so a single client
|
|
19
|
+
# safely serves callers with different ``timeout`` values.
|
|
20
|
+
_sync_client: Any = None
|
|
21
|
+
_async_client: Any = None
|
|
22
|
+
_async_client_loop: Any = None
|
|
23
|
+
_client_lock = threading.Lock()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _get_sync_client() -> Any:
|
|
27
|
+
"""Return the shared sync httpx client, constructing it lazily."""
|
|
28
|
+
global _sync_client
|
|
29
|
+
if _sync_client is None:
|
|
30
|
+
with _client_lock:
|
|
31
|
+
if _sync_client is None:
|
|
32
|
+
import httpx
|
|
33
|
+
_sync_client = httpx.Client()
|
|
34
|
+
return _sync_client
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _get_async_client() -> Any:
|
|
38
|
+
"""Return the shared async httpx client for the running event loop.
|
|
39
|
+
|
|
40
|
+
``httpx.AsyncClient`` binds its connection pool to the event loop that first
|
|
41
|
+
used it, so a client cached across separate ``asyncio.run()`` lifecycles (or
|
|
42
|
+
reused from a different loop) fails with a loop-closed error. We therefore
|
|
43
|
+
key the cached client to its owning loop and rebuild it whenever the current
|
|
44
|
+
loop differs from the one that created it.
|
|
45
|
+
"""
|
|
46
|
+
global _async_client, _async_client_loop
|
|
47
|
+
import httpx
|
|
48
|
+
|
|
49
|
+
try:
|
|
50
|
+
current_loop = asyncio.get_running_loop()
|
|
51
|
+
except RuntimeError:
|
|
52
|
+
current_loop = None
|
|
53
|
+
|
|
54
|
+
with _client_lock:
|
|
55
|
+
if _async_client is None or _async_client_loop is not current_loop:
|
|
56
|
+
_async_client = httpx.AsyncClient()
|
|
57
|
+
_async_client_loop = current_loop
|
|
58
|
+
return _async_client
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def close_clients() -> None:
|
|
62
|
+
"""Close the cached sync client and clear the sync/async globals.
|
|
63
|
+
|
|
64
|
+
Provided as an explicit shutdown hook for long-lived hosts that want to
|
|
65
|
+
release the pooled sockets deterministically. The async client cannot be
|
|
66
|
+
awaited from this sync helper, so it is dropped (and rebuilt per-loop on next
|
|
67
|
+
use); the sync client is closed here.
|
|
68
|
+
"""
|
|
69
|
+
global _sync_client, _async_client, _async_client_loop
|
|
70
|
+
with _client_lock:
|
|
71
|
+
if _sync_client is not None:
|
|
72
|
+
try:
|
|
73
|
+
_sync_client.close()
|
|
74
|
+
finally:
|
|
75
|
+
_sync_client = None
|
|
76
|
+
_async_client = None
|
|
77
|
+
_async_client_loop = None
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
async def aclose_clients() -> None:
|
|
81
|
+
"""Await-close the cached async client (in its own loop) and the sync one."""
|
|
82
|
+
global _sync_client, _async_client, _async_client_loop
|
|
83
|
+
client = None
|
|
84
|
+
with _client_lock:
|
|
85
|
+
client = _async_client
|
|
86
|
+
_async_client = None
|
|
87
|
+
_async_client_loop = None
|
|
88
|
+
if _sync_client is not None:
|
|
89
|
+
try:
|
|
90
|
+
_sync_client.close()
|
|
91
|
+
finally:
|
|
92
|
+
_sync_client = None
|
|
93
|
+
if client is not None:
|
|
94
|
+
await client.aclose()
|
|
11
95
|
|
|
12
96
|
|
|
13
97
|
@dataclass
|
|
@@ -121,22 +205,20 @@ def passthrough(
|
|
|
121
205
|
metadata=metadata or {},
|
|
122
206
|
)
|
|
123
207
|
except AttributeError:
|
|
124
|
-
# Fallback to httpx if passthrough
|
|
125
|
-
import httpx
|
|
126
|
-
|
|
208
|
+
# Fallback to a shared httpx client if the passthrough route is missing.
|
|
127
209
|
url = f"{_validate_api_base(api_base) if api_base else 'https://api.openai.com'}{endpoint}"
|
|
128
210
|
request_headers = headers or {}
|
|
129
211
|
if api_key:
|
|
130
212
|
request_headers['Authorization'] = f"Bearer {api_key}"
|
|
131
213
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
214
|
+
response = _get_sync_client().request(
|
|
215
|
+
method=method,
|
|
216
|
+
url=url,
|
|
217
|
+
headers=request_headers,
|
|
218
|
+
json=json_data,
|
|
219
|
+
data=data,
|
|
220
|
+
timeout=timeout,
|
|
221
|
+
)
|
|
140
222
|
|
|
141
223
|
return PassthroughResult(
|
|
142
224
|
data=response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text,
|
|
@@ -203,21 +285,19 @@ async def apassthrough(
|
|
|
203
285
|
metadata=metadata or {},
|
|
204
286
|
)
|
|
205
287
|
except AttributeError:
|
|
206
|
-
import httpx
|
|
207
|
-
|
|
208
288
|
url = f"{_validate_api_base(api_base) if api_base else 'https://api.openai.com'}{endpoint}"
|
|
209
289
|
request_headers = headers or {}
|
|
210
290
|
if api_key:
|
|
211
291
|
request_headers['Authorization'] = f"Bearer {api_key}"
|
|
212
292
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
293
|
+
response = await _get_async_client().request(
|
|
294
|
+
method=method,
|
|
295
|
+
url=url,
|
|
296
|
+
headers=request_headers,
|
|
297
|
+
json=json_data,
|
|
298
|
+
data=data,
|
|
299
|
+
timeout=timeout,
|
|
300
|
+
)
|
|
221
301
|
|
|
222
302
|
return PassthroughResult(
|
|
223
303
|
data=response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text,
|
|
@@ -83,7 +83,24 @@ class LangfuseClient:
|
|
|
83
83
|
self.secret_key = secret_key
|
|
84
84
|
self.host = host.rstrip("/") # Remove trailing slash
|
|
85
85
|
self._auth = HTTPBasicAuth(public_key, secret_key)
|
|
86
|
+
# Reuse a single Session so keep-alive connections and the auth handler
|
|
87
|
+
# persist across the many trace/session/observation lookups made by the
|
|
88
|
+
# interactive ``praisonai langfuse`` browser.
|
|
89
|
+
self._session = requests.Session()
|
|
90
|
+
self._session.auth = self._auth
|
|
86
91
|
|
|
92
|
+
def close(self) -> None:
|
|
93
|
+
"""Close the underlying HTTP session and release its connection pool."""
|
|
94
|
+
session = getattr(self, "_session", None)
|
|
95
|
+
if session is not None:
|
|
96
|
+
session.close()
|
|
97
|
+
|
|
98
|
+
def __enter__(self) -> "LangfuseClient":
|
|
99
|
+
return self
|
|
100
|
+
|
|
101
|
+
def __exit__(self, *exc_info: Any) -> None:
|
|
102
|
+
self.close()
|
|
103
|
+
|
|
87
104
|
@classmethod
|
|
88
105
|
def from_config_file(cls, config_path: Optional[Path] = None) -> "LangfuseClient":
|
|
89
106
|
"""
|
|
@@ -149,7 +166,7 @@ class LangfuseClient:
|
|
|
149
166
|
url = f"{self.host}{endpoint}"
|
|
150
167
|
|
|
151
168
|
try:
|
|
152
|
-
response =
|
|
169
|
+
response = self._session.get(url, params=params, timeout=30)
|
|
153
170
|
response.raise_for_status()
|
|
154
171
|
return response.json()
|
|
155
172
|
except requests.exceptions.HTTPError as e:
|
|
@@ -109,7 +109,29 @@ class FrameworkAdapterRegistry(PluginRegistry[FrameworkAdapter]):
|
|
|
109
109
|
"No supported framework installed. Available adapters: "
|
|
110
110
|
f"{self.list_all_names()}"
|
|
111
111
|
)
|
|
112
|
-
|
|
112
|
+
|
|
113
|
+
def resolve_or_default(self, name: Optional[str]) -> str:
|
|
114
|
+
"""Resolve an explicit framework name, or fall back to the default.
|
|
115
|
+
|
|
116
|
+
Single source of truth for the ``name or 'praisonai'`` fallbacks that
|
|
117
|
+
were previously scattered across the wrapper (agents_generator, jobs,
|
|
118
|
+
scheduler, workflow_framework). Callers pass whatever the user gave —
|
|
119
|
+
typically ``self.framework or config.get('framework')`` — and get back
|
|
120
|
+
either that name (stripped) or the registry-selected default.
|
|
121
|
+
|
|
122
|
+
When ``pick_default()`` cannot resolve (no adapter installed), fall back
|
|
123
|
+
to ``DEFAULT_PRIORITY[0]`` so downstream availability validation can
|
|
124
|
+
raise its own actionable error instead of this helper masking it.
|
|
125
|
+
"""
|
|
126
|
+
if name:
|
|
127
|
+
resolved = str(name).strip()
|
|
128
|
+
if resolved:
|
|
129
|
+
return resolved
|
|
130
|
+
try:
|
|
131
|
+
return self.pick_default()
|
|
132
|
+
except RuntimeError:
|
|
133
|
+
return self.DEFAULT_PRIORITY[0]
|
|
134
|
+
|
|
113
135
|
def _validate_adapter(self, name: str, adapter) -> None:
|
|
114
136
|
"""Validate that adapter implements the required protocol signature.
|
|
115
137
|
|
|
@@ -70,6 +70,13 @@ def validate_workflow_framework(
|
|
|
70
70
|
raise ValueError(message)
|
|
71
71
|
|
|
72
72
|
|
|
73
|
-
def framework_from_config(config: Dict[str, Any]) -> str:
|
|
74
|
-
"""Return normalised framework name from a parsed YAML config dict.
|
|
75
|
-
|
|
73
|
+
def framework_from_config(config: Dict[str, Any], *, registry: Any = None) -> str:
|
|
74
|
+
"""Return normalised framework name from a parsed YAML config dict.
|
|
75
|
+
|
|
76
|
+
Falls back to the registry-selected default (single source of truth) rather
|
|
77
|
+
than a hardcoded framework name when the config omits ``framework``.
|
|
78
|
+
"""
|
|
79
|
+
from .registry import get_default_registry
|
|
80
|
+
|
|
81
|
+
registry = registry or get_default_registry()
|
|
82
|
+
return registry.resolve_or_default(config.get("framework")).lower()
|