Enhance `bump_and_release.py` and `release.py` scripts to add specific
release files instead of all changes. Introduced a check for
uncommitted changes with informative error messages. This reduces the
risk of accidental changes during the release process.
Refactor instructions for issue analysts and software engineers to
enhance clarity. Details include requiring issue number discovery via
local environment and simplifying commit and PR messaging to remove
explicit issue number references.
- Add asyncio queue inbox to GatewaySession for concurrency
- Intercept and enqueue messages while session is executing
- Resolve GatewaySession stepper background worker thread processing
- Implement RecipeBotAdapter to bridge declarative recipes to conversational agents
- Register support for --recipe flag in bot start commands
- Refactor 'praisonai serve recipe' to boot WebSocketGateway instead
* security: Fix CORS Configuration Vulnerabilities (CWE-942) - Replace wildcard origins
- Replace allow_origins=['*'] with secure environment-based configurations
- Update browser server to use BROWSER_CORS_ORIGINS env var with localhost defaults
- Update jobs server to use JOBS_CORS_ORIGINS env var with localhost defaults
- Update example API to use API_CORS_ORIGINS env var with localhost defaults
- Remove wildcard defaults from ServerConfig, GatewayConfig, and AppConfig
- Add secure localhost defaults to MCP server transport
- Update tests and documentation to reflect secure defaults
- Restrict CORS methods and headers to essential ones only
Fixes#1321 - Addresses 3 instances of CWE-942 vulnerabilities
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: praisonai-triage-agent[bot] <praisonai-triage-agent[bot]@users.noreply.github.com>
* fix: Address 3 CORS bugs found in review - chrome-extension regex, http_stream headers, server.py methods/headers
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/b76a2075-da18-4ad5-82e8-79fc09457529
Co-authored-by: MervinPraison <[email protected]>
* security: Fix remaining CORS vulnerabilities (CWE-942)
- Add environment-based CORS defaults (empty for production)
- Validate env vars to reject wildcard origins (*)
- Add missing Idempotency-Key header to jobs CORS
- Unify WebSocket and HTTP CORS origin validation
- Make http_stream transport environment-aware
Fixes all critical security issues identified by code reviewers:
- Production no longer allows localhost by default
- Environment variables cannot bypass security with *
- WebSocket uses same origin validation as CORS middleware
- Jobs API properly supports Idempotency-Key header
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Mervin Praison <[email protected]>
---------
Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com>
Co-authored-by: praisonai-triage-agent[bot] <praisonai-triage-agent[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Mervin Praison <[email protected]>
Updated action and workflow files to use consistent input variable references.
This includes changes to environment variable handling for better clarity
and maintainability, enhancing code quality and reducing potential errors.
* fix(security): replace insecure MD5 with SHA-256 and disable debug mode
Replace all 29 instances of hashlib.md5() with hashlib.sha256() across
22 files. MD5 is cryptographically broken (CWE-328) and should not be
used for hashing, even for non-security purposes like cache keys and
content fingerprints.
Also disable debug=True in api.py (CWE-489) to prevent information
leakage in production deployments.
Vulnerabilities fixed:
- 28x CWE-328: Use of Weak Hash (MD5 → SHA-256)
- 1x CWE-489: Active Debug Code (debug=True → debug=False)
Detected by semgrep (p/owasp-top-ten, p/python).
Verified by re-scan: 66 findings → 37 remaining (29 fixed).
Remaining findings (require manual review):
- 14x shell injection (subprocess with user input)
- 10x subprocess shell=True
- 3x wildcard CORS
- 5x tainted env args in subprocess
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
* fix: address review feedback on MD5→SHA-256 migration
Fixes raised by Gemini Code Assist, Qodo, and CodeRabbit:
1. templates/security.py: algorithm="md5" now raises ValueError
instead of silently returning SHA-256 digest
2. recipe/security.py: CycloneDX serialNumber now uses uuid5()
for RFC 4122 compliant UUID format (was 64-char hexdigest)
3. agent/agent.py: backward-compatible session ID — checks for
legacy MD5-based session file on disk before using new SHA-256 ID
4. snapshot/snapshot.py: backward-compatible shadow repo path —
adopts legacy MD5-based directory if it exists on disk
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---------
Co-authored-by: Michael Winczuk <[email protected]>
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Updated unit and integration tests for better readability and maintainability.
Replaced repetitive subprocess calls with a dedicated `run_doctor` function in
the doctor CLI tests, and improved error handling in the handoff error tests.
Removed unnecessary test cases and cleaned up assertions for clarity.
Total changes: 57 insertions, 151 deletions across 10 files.
Replaced the old use cases section with a more detailed table outlining specific applications of AI agents across various industries, enhancing clarity and usability for readers.
- Remove unreachable dead code (issues list never populated)
- Fix misleading warning message to distinguish channel vs global warnings
- Improve exception handling: ValueError for config errors (FAIL) vs runtime errors (ERROR)
- Make bot checks accessible via CLI by:
- Converting to registry-based @register_check decorators
- Adding bot_checks to register_all_checks()
- Adding 'bots' subcommand to CLI actions and category mapping
Co-authored-by: Mervin Praison <[email protected]>
- Add check_bot_security() function to bot_checks.py doctor module
- Validates allowlist/blocklist configuration across channels
- Warns about overly permissive group policies (respond_all vs mention_only)
- Checks for PRAISONAI_GATEWAY_SECRET to ensure pairing persistence
- Provides actionable remediation guidance for secure configurations
- Integrates with existing doctor framework for 'praisonai doctor --category bots'
This implements the 'doctor-style check' component requested in issue #1313
for auditing risky bot security configurations before production deployment.
Fixes#1313🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: praisonai-triage-agent[bot] <praisonai-triage-agent[bot]@users.noreply.github.com>
Moved the highlighted section from the middle to the bottom of the README for better visibility. Adjusted image and quote formatting to maintain clarity and consistency.
Improved installation instructions for SDK, CLI, Dashboard, and Builders
with example commands. Added new visual elements for better engagement.
Removed redundant elements to streamline content.
Revise main description to emphasize hiring autonomous AI agents.
Condense sections for quick paths and performance, improving the overall flow.
Remove outdated use cases and provide a more engaging introduction to PraisonAI.
- Add Awaitable import and update TaskExecutorProtocol return type for async compatibility
- Add error handling for missing executor agents with clear remediation message
- Fix variable substitution to include team-level variables for async/sync consistency
- Remove unused Union import (already done in previous commit)
Addresses valid reviewer feedback from CodeRabbit, Qodo, Copilot, and Gemini.
Co-authored-by: Mervin Praison <[email protected]>
- Remove duplicate adapters.py file to eliminate multiple sources of truth
- Replace runtime class mutation with composition-based unified dispatch for safety
- Fix missing tool execution parameters in unified sync mode
- Preserve hooks and post-processing flow in unified paths to maintain observability
- Fix duplicate verbose kwarg crash in LiteLLMAdapter
- Fix protocol violations in sync wrappers (no asyncio.run in library internals)
- Fix message extraction logic to prevent prompt duplication
- Make OpenAIAdapter sync delegate to async as required by protocol
- Improve test suite with proper sync/async parity and performance regression tests
- Add comprehensive real agentic test as required by AGENTS.md
All critical issues from reviewers addressed while maintaining backward compatibility.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Mervin Praison <[email protected]>
Implemented automatic discovery and loading of protocol-driven plugins
via pip in the `PluginManager`. The new method `discover_entry_points`
fetches entry points from the `praisonai.plugins` group, loads callable
plugins, and registers them. Updated version number to 1.5.117.
- Remove unused Union import from protocols.py
- Update _build_execution_context() to return ExecutionContext dataclass
- Update _process_task_result() to accept ExecutionContext and return TaskResult
- Fix execute_task/aexecute_task to use attribute access on ExecutionContext
- Remove trailing whitespace in protocols.py
Addresses reviewer feedback from Qodo, Gemini, CodeRabbit, and Copilot
regarding protocol usage consistency and type safety.
Co-authored-by: Mervin Praison <[email protected]>
This commit addresses Issue #1304 by consolidating the dual execution paths
in the LLM layer (LiteLLM vs OpenAI) into a single async-first protocol-driven
architecture, eliminating DRY violations and maintenance burden.
Key changes:
- Added UnifiedLLMDispatcher with provider adapter pattern
- Created LiteLLMAdapter and OpenAIAdapter for protocol conformance
- Enhanced agent chat logic with opt-in unified dispatch
- Maintained full backward compatibility (existing code unchanged)
- Established protocol-driven foundation for future provider additions
Benefits:
✅ Single async chat completion implementation
✅ Sync methods as thin wrappers around async
✅ Protocol-driven provider selection
✅ Elimination of dual execution paths
✅ All existing functionality preserved
Files added:
- praisonaiagents/llm/unified_adapters.py (protocol adapters)
- praisonaiagents/agent/unified_chat_mixin.py (unified implementation)
- test_unified_llm.py (verification tests)
Files modified:
- praisonaiagents/llm/__init__.py (updated exports)
- praisonaiagents/agent/chat_mixin.py (added unified dispatch option)
The unified dispatch is opt-in via _use_unified_llm_dispatch flag, ensuring
zero impact on existing deployments while enabling clean migration path.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <[email protected]>
- Fix GeminiAdapter tool names to match GEMINI_INTERNAL_TOOLS constants
- Fix OllamaAdapter threshold to match LLM.OLLAMA_SUMMARY_ITERATION_THRESHOLD = 1
- Extract generic AdapterRegistry[T] base class to eliminate DRY violation
- Add debug logging to registry exception handling (no longer silent)
- Move InMemoryAdapter from __init__.py to its own in_memory_adapter.py module
- Add 38 unit tests covering all new adapter and registry code paths"
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/0fc360e2-23ac-43a1-8a56-50dd4686feb1
Co-authored-by: MervinPraison <[email protected]>
Shows how to replace scattered provider dispatch in llm.py with clean adapters:
- DefaultAdapter: Base implementation with sensible fallbacks
- OllamaAdapter: Replaces OLLAMA_SUMMARY_ITERATION_THRESHOLD logic
- AnthropicAdapter: Handles Claude prompt caching capabilities
- GeminiAdapter: Handles gemini_internal_tools formatting
- get_provider_adapter(): Replaces model.startswith() branching
This demonstrates the systematic approach for Gap 2 - extracting the 40+
provider branches from core into clean, testable adapters.
Co-authored-by: MervinPraison <[email protected]>
- Fix entry points never discovered in main flow (plugins.enable now calls discover_entry_points)
- Fix fragile entry_points fallback using robust try/except pattern from ToolRegistry
- Fix non-deterministic tests by mocking importlib.metadata properly
- Fix overbroad import monkeypatch to only affect importlib.metadata
- Add thread safety with proper _lock usage in register() and discover_entry_points()
- Add positive test case for successful entry point loading and registration
All reviewer feedback from Qodo, Gemini, CodeRabbit addressed.
Co-authored-by: Mervin Praison <[email protected]>
- Fix HandoffConfig.max_concurrent default from 3 to 5 per issue requirements
- Fix deadlock bug: parallel_handoffs() now treats max_concurrent<=0 as unlimited
- Fix BaseException handling to prevent non-HandoffResult objects in return list
- Export parallel_handoffs in package __init__.py for public API access
- Remove broken documentation URL from deprecation warning
- Wire allow_parallel flag to control parallel_handoffs() behavior
- Fix unused variable warning by prefixing with underscore
These changes address all critical bugs and API inconsistencies identified
by code reviewers while maintaining backward compatibility.
Co-authored-by: Mervin Praison <[email protected]>
- Fix threading.Lock used with async with in Process class (issue #1289)
* Replace sync lock creation with lazy async lock initialization
* Prevents runtime AttributeError in aworkflow method
- Improve thread safety in AsyncPostgres lazy lock initialization
* Add double-checked locking pattern to prevent race conditions
* Ensures only one asyncio.Lock instance created across coroutines
- Remove redundant asyncio import in async_postgres.py
- Improve exception chaining for better error diagnostics
Addresses critical issues raised by Gemini, Qodo, CodeRabbit reviewers.
Co-authored-by: Mervin Praison <[email protected]>
- Add discover_entry_points() method to PluginManager for automatic plugin discovery
- Support pip-installed plugins via 'praisonaiagents.plugins' entry_points group
- Compatible with Python 3.8+ using importlib.metadata
- Graceful error handling for missing dependencies
- Added comprehensive unit tests for entry_points discovery
- Enables external plugin packages like PraisonAI-Plugins to be auto-discovered
Fixes#1293
Co-authored-by: Mervin Praison <[email protected]>
Addresses Gap 2 from issue #1289:
1. Replace asyncio.Lock() with threading.Lock() in Process.__init__() - asyncio.Lock in sync constructor fails outside event loop
2. Add async lock protection to async postgres store init() to prevent race conditions creating duplicate connection pools
3. Fix memory state store _maybe_save() race condition where multiple threads could trigger overlapping saves
4. Verified existing thread safety in global error_logs, callbacks already properly protected with locks
5. Verified MemoryMixin already has proper thread safety with _history_lock
These changes ensure multi-agent safety by eliminating race conditions and thread safety issues that could corrupt state or cause crashes when running multiple agents concurrently.
Co-authored-by: Mervin Praison <[email protected]>
Refactor tests for `LangfuseSinkEmit` to use agent spans with a consistent
identifier format. Update assertions to reflect changes in method
validations for agent classes in `TestApiMdGenerator`. Adjusted several
mock object usages for improved clarity and consistency across tests.
Root cause of issue #1283 failure:
1. git config was local, not --global, so identity failed in cloned repos
2. External repos (PraisonAIDocs) were cloned with bare https (no auth)
3. Claude tried to push to main instead of a feature branch
Fix:
- Use --global git config for identity across all repos
- Add STEP 3-ALT with explicit cross-repo workflow using gh repo clone
- gh repo clone auto-configures auth token for push
- Add PraisonAI-Plugins and PraisonAIDocs to routing table
- Explicit instructions to never use bare git clone https://
- Resolve merge conflicts with main branch
- Fix getattr sandbox inconsistency by removing getattr from blocked AST calls
- Combine dangerous patterns from both branches for comprehensive protection
- Allow _safe_getattr implementation to work properly in sandbox mode
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Claude <[email protected]>
- Fix ModelNotAvailableError to properly pass provider/model to base exception
- Fix RateLimitError type annotation (Optional[str] instead of str = None)
- Fix ContextLengthExceededError to accept and pass provider/model parameters
- Add async aretrieve method to RetrievalStrategyProtocol for async I/O support
- Add missing newline at end of protocols.py file
Addresses review feedback from code reviewers.
Co-authored-by: Mervin Praison <[email protected]>
Moved test agents and tools to a dedicated fixtures directory. Updated test scripts to reference the new file paths. Removed obsolete test agent and tool files. Improved instructions for running tests.
Explicitly tells Claude to clone and open PRs in MervinPraison/PraisonAI-Tools
when a request is for an external tool, integration, or community extension.
- Improved `get_agent_ledger` method in `ledger.py` by adding validation
for `agent_id` to raise a `ValueError` if it is empty.
- Updated `_get_output_path` in `monitor.py` to include detailed path
sanitization steps and added checks to prevent path traversal attacks.
- Refined agent name sanitation and fallback techniques to ensure unique
naming.
- Incremented version number to `1.5.114` in `pyproject.toml` and
`uv.lock`.
After rebase, commit 72e477f added runtime support for:
- context str/dict -> restore to type hint
- autonomy str -> restore to type hint
- approval dict -> restore to type hint
- learn str -> restore to type hint
templates str remains removed (resolve() with no presets returns None).
Updated all docstrings to document actual supported types including new forms.
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/e371c8e1-a816-4fb2-8eb8-a18242daa2de
Co-authored-by: MervinPraison <[email protected]>
- Add missing 'from starlette.routing import Mount' import
- Mount was used on line 1046 but not imported
- Fixes NameError when launching agents in MCP mode
🤖 Generated with Claude Code
Co-authored-by: MervinPraison <[email protected]>
- Add string preset handling in _init_autonomy() for autonomy='full_auto' etc.
- Add str/dict support in context_manager property for context='summarize' etc.
- Add dict-to-ApprovalConfig conversion for approval={'backend': ..., 'all_tools': True}
- Add string mode handling in learn parameter for learn='agentic' etc.
- Fix AUTONOMY_PRESETS to use 'level' field (not 'mode') per AutonomyConfig
Resolves type hint/implementation mismatches identified by code reviewers.
All new type hints now have proper runtime support.
Co-authored-by: Mervin Praison <[email protected]>
- Remove _global_hooks, enable_observability(), disable_observability(), and get_hooks()
- Observability is now strictly per-agent/per-pipeline to comply with AGENTS.md Rule 4.5
- Agent class already correctly uses per-instance ObservabilityHooks() when observe=True
- Eliminates shared mutable state between agents for multi-agent safety
Addresses critical architecture gap identified in PR #1277 final review.
Co-authored-by: Mervin Praison <[email protected]>
* fix(ci): integrate Claude final review directly into auto-pr-comment workflow to bypass action_required approval gate
* fix(ci): address review issues in auto-pr-comment workflow
- Fix template injection: use env vars + process.env instead of inline ${{ }} in JS
- Add timeout-minutes: 15 to polling jobs (prevent runaway Actions minutes)
- Add issues: write permission to all Claude-trigger jobs
- Restore claude-after-gemini job lost when chain-claude-after-copilot.yml was deleted
- DRY: extract polling constants and trigger login list to workflow-level env vars
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/0ff67a7f-85be-4e2e-a16f-f3f48ebfefb5
Co-authored-by: MervinPraison <[email protected]>
---------
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: MervinPraison <[email protected]>
* fix: remove global logging monkey-patch from memory.py
Remove logging.Logger.trace monkey-patch that violated protocol-driven
architecture by modifying global state at import time. The trace
functionality remains available locally within the memory module.
This addresses one architectural violation from issue #1262 while
maintaining backward compatibility and keeping changes minimal.
Co-authored-by: Mervin Praison <[email protected]>
* fix: replace logger.trace() with logger.log(TRACE_LEVEL) after removing monkey-patch
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/56f044b6-1424-4985-b09b-afe047dadd8b
Co-authored-by: MervinPraison <[email protected]>
---------
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Mervin Praison <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
- Add _safe_extractall() to reject absolute paths, '..' traversal, and path escape in tar archives
- Validate name/version from manifest BEFORE any filesystem operation in LocalRegistry.publish
- Add path confinement check ensuring resolved recipe_dir stays under recipes_path
- Validate URL path params in RegistryServer publish endpoint (early 400 rejection)
- Replace vulnerable tar.extractall() calls in both LocalRegistry and HttpRegistry
- Bump version to 4.5.113
* fix(sandbox): update sandlock integration to use real API surface
- Replace sandlock.is_available() with landlock_abi_version() >= 6 check
- Remove non-existent TimeoutError and SecurityViolationError exception handling
- Remove invalid max_cpu_time_seconds parameter from Policy constructor
- Update sandbox.run() to only pass cmd and timeout (remove env/cwd)
- Update tests to use correct API mocks
Fixes#1258
Co-authored-by: Mervin Praison <[email protected]>
* fix(sandbox): fix ABI version threshold, remove dead except block, unused var, and fix test mocks
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/ee8122be-e5f3-47dd-bcb6-c0994df15169
Co-authored-by: MervinPraison <[email protected]>
* fix(sandbox): implement proper sandlock Result status mapping and improve test reliability
- Fix exit_code status mapping: Check result.success and exit_code before returning SandboxStatus.COMPLETED
- Update test mocks to return proper Result objects with success/exit_code instead of raising exceptions
- Add integration test that exercises real sandlock API if available
- Address reviewer feedback from CodeRabbit, Qodo, Gemini, and Copilot
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: MervinPraison <[email protected]>
---------
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Mervin Praison <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Updated the tools in multiple example scripts to use `list_files` instead of `list_directory`. Removed unnecessary global variables and functions in `shell_tools.py` for better clarity and performance. Updated the `approval` flag in agent configurations to `False` for consistency across examples.
Updated the user email in multiple GitHub workflows to a no-reply address for better privacy. This change ensures consistency across the repository's automation scripts.
fix(examples): update web configuration in agent examples
Modified web configuration in `agent_centric_api.py` examples to utilize `WebConfig`. This enhances clarity and control over the web search functionality.
test(unit): skip integration test without API key
Added a condition to skip the `test_circuit_breaker_real_agentic` if the OpenAI API key is not set. This prevents unnecessary test failures in the absence of required credentials.
* feat: enhance evaluation framework with EvalSuite, ComparisonEval, and SafetyEval
- Add EvalSuite orchestrator for running multiple evaluations with aggregated results
- Add ComparisonEval for side-by-side A/B testing of agent outputs across criteria
- Add SafetyEval for detecting harmful/biased/inappropriate content across 6 categories
- Update eval/__init__.py with new exports and lazy loading
- Add comprehensive unit tests for all new components (150+ test cases)
- Follow protocol-driven architecture with zero performance impact
- Maintain backward compatibility with existing eval framework
Addresses #1245🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Mervin Praison <[email protected]>
* fix(eval): resolve critical issues and add real agentic tests
- Add missing _make_llm_call method to BaseLLMGrader for ComparisonGrader and SafetyGrader
- Fix after_run() calls to pass required result parameter
- Fix winner parsing logic to prevent 'Agent B' misclassification as 'agent_a'
- Fix safety score parsing to prevent LLM override of worse category scores
- Fix EvalSuite fail_fast behavior to properly re-raise RuntimeError
- Add support for AccuracyResult avg_score in EvalSuite scoring
- Fix Python type hints compatibility (tuple[str,str] → tuple)
- Add comprehensive real agentic integration tests that call agent.start()
Addresses all critical issues identified in code reviews and fulfills
AGENTS.md Section 9.4 requirement for real agentic tests.
Co-authored-by: Mervin Praison <[email protected]>
---------
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Mervin Praison <[email protected]>
Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com>
- PostgreSQL: validate table name against safe identifier regex to
prevent SQL injection via user-controlled table parameter
- MongoDB: escape regex metacharacters in list_keys prefix to prevent
ReDoS / unexpected pattern matching
- MongoDB: use $setOnInsert for created_at so it is preserved on
update (was being overwritten on every save)
- DynamoDB: replace raw string FilterExpression with proper Boto3
Attr().begins_with() condition in list_keys
- DynamoDB: remove redundant boto3 import in _create_table (already
imported in _get_table)
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/c012c607-294a-4cef-864d-91a2bccca2dd
Co-authored-by: MervinPraison <[email protected]>
- Remove eager module-level imports of heavy backends (Redis/MongoDB/PostgreSQL/DynamoDB)
- Implement lazy loading in get_backend() function using getattr() only when needed
- Update __all__ exports to only include lightweight backends
- Add module-level __getattr__ for backward compatibility
- Follow praisonaiagents/db pattern for proper separation of core vs wrapper
Fixes critical architectural violation where heavy wrapper dependencies
were being imported at module level, breaking the lazy loading design.
Core SDK imports now work without wrapper package (< 50ms import time).
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Mervin Praison <[email protected]>
Compromised versions 1.14.1 and 0.30.4 were removed from npm registry
but semver ranges (^1.7.9) could resolve to malicious versions if
they're re-released or exist in alternate registries.
Pinning to exact version 1.8.4 prevents this attack vector entirely.
The base claude-code-action does not accept 'prompt_file' or 'install_github_mcp'.
This routes the prompt properly through 'direct_prompt' using GitHub step outputs.
Updated README.md to include a new section for the PraisonAI UI,
providing installation instructions and a brief description.
Bumped version numbers in pyproject.toml and lock files to
reflect changes and dependency updates.
Updated package version to 1.5.99 and introduced new memory handling
features in PraisonAI components. Added configuration for session
tracking in memory save. Included additional tests for agent and task
components to ensure correct functionality and integration.
Relocated image assets from the public directory to the .github/images directory. Updated references in README files to reflect the new asset locations. Added a new GIF asset for showcasing command execution. Total of 14 files changed with 16 insertions and 8 deletions.
- STEP 0: Set git identity to MervinPraison for all commits
- STEP 2: Mandatory bloat validation checklist before writing code
- Checks: protocol-driven design, no heavy impls in core SDK, no duplication,
proper Agent inheritance, lazy imports, no agent.py growth, no name collisions
- If checks fail: close issue with explanation instead of creating bad PRs
- Strengthen attribute access guards in code execution sandbox
- Parameterize SQL IN clauses in data layer
- Add URL scheme validation for API base URLs
- Use plain string matching instead of regex for tool search
Merges centralized logging (_logging.py, 152 files migrated) and resilience utility (utils/resilience.py). Also fixes CI/CD workflows and test fixtures.
Closes#1131#1132
Updated logger level settings to use consistent DEBUG and WARNING levels
based on the verbosity of the application. This enhances logging clarity
and ensures that third-party loggers are set to WARNING by default.
Adjusted imports to maintain consistent logging behavior across various
modules for better maintainability. Additionally, bumped version in
pyproject.toml to 1.5.89.
- Introduced a new agent for cross-posting on multiple social media platforms with required environment variables.
- Added a video generation example using HeyGen and ElevenLabs, demonstrating autonomous video production.
- Created YAML workflow for sequential multi-agent processing in video generation.
- Updated several test files to accommodate new features and examples.
## Critical Fixes:
- **agent.py (IndentationError)**: Removed 137 lines of orphaned MCP code (lines 8849-8983)
that caused an IndentationError on import, completely breaking the SDK. This was
dead code from a bad merge — partially commented out code with live import statements.
- **python_tools.py (Sandbox)**: Fixed subprocess sandbox that was too restrictive:
- Added missing builtins: getattr, ValueError, TypeError, KeyError, etc.
- Added __build_class__ for function/class definition support
- Fixed exec() to use shared globals so defined functions can see each other
- Added _safe_getattr wrapper in subprocess for defense-in-depth dunder blocking
- **circuit_breaker.py**: Fixed reset_all() to clear registry entries (not just reset state)
## Test Fixes:
- test_circuit_breaker.py: Fixed success_threshold mismatch, added setup/teardown cleanup
- test_tools_reliability.py: Fixed psutil mock injection for lazy-imported modules
- test_python_tools_sandbox.py: Updated security test expectations for sandbox mode
- Added __init__.py files to 13 test subdirectories for pytest module resolution
## Metrics:
- agent.py: 9053 → 8916 lines (-137 lines of dead code)
- Import time: 67.5ms (well under 200ms target)
- Unit tests: 4473 passed, 50 skipped (7 pre-existing failures)
- Add lightweight CircuitBreaker class with open/half-open/closed states
- Integrate with existing retry utilities in tools/retry.py
- Add health monitoring and graceful degradation support
- Provide integration helpers for LLM, Memory, and MCP systems
- Include comprehensive tests with real agentic test
- Maintain backward compatibility and zero performance regression
- Follow protocol-driven architecture from AGENTS.md
Fixes#1141🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mervin Praison <[email protected]>
- Create centralized config/resolver.py with protocol-driven design
- Add ConfigRegistry for tracking all environment variables
- Implement caching and type conversion for performance
- Add validation to warn about unknown/deprecated vars
- Extend 'praison config' CLI with env discovery and validation
- Maintain 100% backward compatibility with existing os.getenv() usage
- Follow AGENTS.md principles: protocol-driven, no performance impact
Fixes#1140 - 317+ scattered env var reads now have unified entry point
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mervin Praison <[email protected]>
- Add global server state lock (_agents_server_lock) to protect FastAPI endpoint registration
- Add task ID assignment lock (_task_id_lock) to prevent race conditions in parallel execution
- Add state mutation lock (_state_lock) to protect AgentTeam shared variables and _state
- Thread-safe protection for all critical sections in server startup and state management
Fixes#1152🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mervin Praison <[email protected]>
Fixes issue #1128 by systematically replacing problematic exception
handling patterns that were masking real errors and making debugging
extremely difficult.
Changes:
- Replace bare 'except:' clauses with 'except Exception:' to avoid
catching SystemExit/KeyboardInterrupt
- Add structured debug logging for all previously silent exceptions
- Maintain backward compatibility and zero performance impact
- Focus on core SDK modules: memory, tools, LLM, telemetry
Key areas fixed:
- Memory operations: Now log failed tracing and cleanup operations
- Telemetry: Debug logging for PostHog failures and queue errors
- LLM client: Debug logging for cost calculation and display failures
- Tools: Debug logging for browser checks and capability detection
- Code execution: Debug logging for temp file cleanup failures
All exception handling now provides context for debugging while
maintaining the fail-safe behavior required for production use.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mervin Praison <[email protected]>
- Add code_sandbox_mode parameter to ExecutionConfig (default: 'sandbox')
- Implement _execute_code_sandboxed() using subprocess isolation
- Maintain backward compatibility with 'direct' mode (legacy)
- Subprocess sandbox runs in clean environment (no env vars, files, network)
- Same security validations: AST parsing + text pattern blocking
- Zero performance regression: lazy imports, same API
- All existing security tests pass
- Safe by default: new installs use sandboxed mode
Resolves security vulnerability where exec() ran in same process
with access to filesystem, network, and environment variables.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mervin Praison <[email protected]>
* fix: implement token tracking in RouterAgent for cost observability
- Add TokenUsage dataclass with structured token consumption data
- Enhance LLM.get_response() with optional return_token_usage parameter
- Update RouterAgent to track tokens and costs per model selection
- Emit token usage via existing trace infrastructure for observability
- Maintain full backward compatibility with zero performance regression
Resolves issue #1138 - RouterAgent now provides complete cost visibility
for multi-agent routing scenarios, addressing the TODO at line 234.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <[email protected]>
* fix: correct critical bugs in _prepare_return_value token tracking
- Move _prepare_return_value closure to before the try block in
get_response() so it's defined before use
- Fix infinite recursion: both branches called themselves instead
of returning the text value
- Revert _prepare_return_value usage from 7 out-of-scope methods
(_process_stream_delta, get_response_async, _extract_from_responses_output,
_stream_responses_api, _stream_responses_api_async, response, aresponse)
where it was a NameError and would corrupt return tuple structure
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/1b069906-c514-4c5f-8c93-34c345db5fd0
Co-authored-by: MervinPraison <[email protected]>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: MervinPraison <[email protected]>
Fixes identified issues from PR #1179:
- Add type hints to chat(), run(), start(), execute_tool(), execute() methods
- Fix ephemeral() return type to Generator[None, None, None] for context manager
- Add Optional[str] return types for methods that can return None (chat, run, execute)
- Add type hints to all property getters and setters
- Add type annotations to **kwargs parameters
This resolves type checker warnings and improves IDE autocompletion support.
Co-authored-by: Mervin Praison <[email protected]>
- Use thread-safe registry.unregister() in remove_tool()
- Use thread-safe registry.list_tools() in list_tools()
- Add double-checked locking to get_registry() singleton
- Prevents race conditions in multi-agent deployments
Related to #1167 and closed PR #1182
Co-authored-by: Mervin Praison <[email protected]>
* fix: implement lazy loading for tools imports to improve package startup time
- Remove eager imports of tools modules from __init__.py (lines 63-66, 72)
- Add tools imports to _LAZY_IMPORTS mapping for proper lazy loading
- Create embedding proxy to resolve function vs subpackage conflict
- Maintain 100% backward compatibility with existing imports
- Improve startup performance by loading tools only when accessed
Fixes#1168
This addresses the core SDK eagerly importing heavy modules issue by:
1. Moving from .tools.* imports to lazy loading system
2. Using existing _LAZY_IMPORTS infrastructure
3. Resolving embedding function import conflict via proxy
4. Zero breaking changes to public API
Performance improvement: Base import reduced from heavy module loading
to lightweight protocol-driven imports following AGENTS.md principles.
Co-authored-by: Mervin Praison <[email protected]>
* fix: address lazy loading implementation issues
- Remove eager config import, move to lazy loading in _custom_handler
- Remove heavy modules from fallback_modules to prevent imports on typos
- Add proper tools/config/memory/workflows module access via _custom_handler
- Fix _EmbeddingProxy introspection with __wrapped__ and __signature__ properties
- Remove dead code in _custom_handler for embedding/embeddings
- Clean up duplicate comments and self-referential error messages
- Maintain full backward compatibility while improving startup performance
Fixes all issues identified in code review by Copilot, CodeRabbit, and Qodo.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: Mervin Praison <[email protected]>
* fix: address lazy loading implementation issues
- Fix _get_embedding_func to avoid overwriting embedding proxy
- Clean up dead code comments
- Update comments for clarity
- All validation tests pass: pa.tools, pa.config, embedding introspection
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Mervin Praison <[email protected]>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mervin Praison <[email protected]>
Bot PR chain: trigger CodeRabbit + Qodo + Gemini → they post reviews →
copilot-after-coderabbit/qodo fires → Copilot reviews → Claude chains.
Copilot is NEVER triggered directly for bot PRs anymore. It waits
for upstream reviewers to finish first.
CodeRabbit and Qodo skip bot-authored PRs by default, breaking the
entire review chain (no reviews → no Copilot → no Claude).
Added bot-pr-review-chain job that fires on PR opened by
github-actions[bot] and directly triggers @coderabbitai, /review,
and @copilot.
Root .gitignore line 22 has 'output' which was excluding the
praisonaiagents/output/ module from git. This caused Windows CI
ModuleNotFoundError: No module named 'praisonaiagents.output.models'
Added gitignore exemption and force-added the missing files.
Was checking for 'copilot-swe-agent' but actual PR reviewer
posts as 'copilot-pull-request-reviewer[bot]'. This is why
Claude's final review was never triggered after Copilot.
Root cause: issues created with '--label claude' triggered both
'issues:opened' and 'issues:labeled' events in claude.yml.
Fix: remove 'opened' from claude.yml triggers (only fire on label).
Also: auto-issue-comment.yml skips if 'claude' label already exists.
Claude was only providing PR links instead of creating them.
CLAUDE.md is auto-read by claude-code-action and instructs Claude
to always use 'gh pr create' to create PRs automatically.
Root cause: PR #1170 had no Coderabbit review, so Copilot/Claude
were never triggered. Now fires after either reviewer, with dedup
check to prevent double @copilot comments.
Added detailed sections in README for using YAML with agents, including
two comprehensive examples illustrating agent collaboration and custom
tools. Updated AGENTS.md to reflect CLI and YAML parity, and emphasized
the requirement for real agentic tests in the implementation checklist.
- auto-pr-comment.yml: posts @copilot immediately on PR open
- auto-issue-comment.yml: posts @copilot immediately on issue open
- chain-claude-after-copilot.yml: watches for copilot-swe-agent comment,
then posts @claude as final reviewer (event-driven, no sleep delays)
- Saves ~16 min of wasted runner time per PR
- auto-pr-comment.yml: Copilot at T+6min (bloat guard), Claude at T+17min (final reviewer)
- auto-issue-comment.yml: Copilot triages first, Claude implements fix after
- claude.yml: remove post-review-comment job (caused infinite review cycles)
- Each bot has specialized role prompt instead of generic review
Security (#1157): Replace eval() with json.loads() in singlestore_vector.py,
AST-whitelisted evaluator in ai_generator.py, and AST node validation in
job_workflow.py/hybrid_workflow.py to prevent arbitrary code execution.
Performance (#1154): Convert eager module-level Rich imports to lazy
function-level imports in main.py, agents.py, knowledge.py, video_agent.py,
and image_agent.py — Rich is no longer loaded on `import praisonaiagents`.
https://claude.ai/code/session_01MZtrpciafckLxpmrn1z6P2
- Introduced `BudgetExceededError` for handling budget overages.
- Implemented budget tracking in the `Agent` class.
- Added properties for total cost and cost summary.
- Updated various agents to support budget constraints.
- Enhanced lazy loading to include new budget-related components.
- Extensive test coverage added for the new budget features.
LiteLLM v1.82.7 and v1.82.8 contained a credential stealer from a
supply chain attack (compromised PyPI maintainer via Trivy CI/CD).
Both versions removed from PyPI.
PraisonAI was NOT affected (installed 1.81.1), but as a defensive
measure, cap the upper bound at 1.82.6 (latest safe) until LiteLLM
completes their supply-chain review and resumes releases.
Ref: https://docs.litellm.ai/blog/security-update-march-2026
#1134: Decouple execute_code from optional deps (black/pylint/autopep8)
- execute_code is now a standalone module-level function
- PythonTools class retained for analyze/format/lint (lazy-init)
- Agents can now use execute_code without heavy optional deps
#1129: Thread-safety for remaining global mutable state
- Add _lazy_import_lock with double-checked locking for all 6 lazy-import
caches (_rich_console, _rich_live, _llm_module, _main_module, etc.)
- Add _env_cache_lock for class-level env var caches
(_env_output_mode, _default_model)
#1137: Clarify misleading TODO comment
- Updated TODO in llm.py to clarify this is code-level DRY, not
duplicate API calls per request
- Reject empty strings, keys containing "=" or NUL in _validate_env_key()
(CodeRabbit: malformed keys should fail during validation, not at os.environ)
- Validate root config is a dict after yaml.safe_load() (handles list/scalar/None)
- Validate deployment section is a dict before .get() calls
- Both raise ValueError caught by the existing handler → clean CLI error
- Add test_malformed_env_keys_rejected, test_non_dict_root_config_rejected,
test_non_dict_deployment_rejected (7 tests total, all passing)
Extract ~120 lines of duplicated approval code from _execute_tool_impl()
and execute_tool_async() into shared helpers _check_tool_approval_sync()
and _check_tool_approval_async(). Add threading.Lock to protect
_agent_counter, _server_started, _registered_agents, and _shared_apps
against concurrent access in multi-agent scenarios.
https://claude.ai/code/session_01WiGKiwTBj7xo5YoF3PYjWF
The --schedule-config YAML file allows setting arbitrary environment
variables via the "environment" section. An attacker who can supply or
modify this file could set keys like LD_PRELOAD, PATH, PYTHONPATH, etc.
to achieve arbitrary code execution.
Add _validate_env_key() with a blocklist of security-sensitive env var
names (dynamic linker, search paths, proxies) and call it before each
os.environ assignment in the schedule-config loading path.
Also add unit tests for the validation function.
- Replace hardcoded CHAINLIT_AUTH_SECRET with secrets.token_hex(32) fallback in all 5 UI files
(agents.py, bot.py, chat.py, code.py, realtime.py) — secret was public in git history
- Use hmac.compare_digest() for constant-time API key comparison in recipe/serve.py
- Disable debug=True by default in deploy.py generated api.py; use DEBUG env var
- Restrict exec() __builtins__ to safe subset in job_workflow.py inline Python execution;
prevents __import__('os').system() and similar arbitrary code execution patterns
Skipped shell=True changes (would break YAML run: steps with pipes/env vars) and
CORS wildcard changes (would break browser extension without env var migration path).
These require separate architectural discussion.
- Replace eval(e) in unified_server.py with AST-based safe math evaluator
- Replace exec(script_content) in run_with_langtrace.py with subprocess.run()
- Add nh3.clean() output sanitization in api.py to prevent XSS from markdown links
- Replace eval() in basic-tools.ts and custom-tool.ts with regex allowlist + Function constructor
- Replace eval() in simplified-api-test.ts and comprehensive-live.test.ts with safe evaluator
All changes are in example files and dev helper scripts only.
No SDK core code modified. Unit tests: 4341 passed, 0 new failures.
Updated the availability check for Crawl4AI to include Playwright browser installation advice. Improved error handling when starting the web crawler, ensuring users are informed if necessary binaries are missing. Incremented version in pyproject.toml to 1.5.78 and added new dependencies for crawling functionality.
Implemented logging for job execution history via a new RunRecord class.
This includes methods for logging job runs, retrieving execution history,
and persisting the history to a file. Enhancements to the config store
allow for configurable maximum history depth, improving traceability
of job executions.
Introduced a new schedule store utilizing YAML files for
persistence. This allows scheduled jobs to be stored under
the "schedules" key in the existing config.yaml, enhancing
thread safety and maintaining existing config information.
Updated related modules to integrate the new store.
Added a new ScheduleStoreProtocol to standardize schedule persistence backends.
Updated ScheduleLoop and ScheduleRunner to use the protocol, allowing various
implementations for schedule storage. Introduced _run_schedule_loop in BotOS
to ensure scheduled jobs execute alongside bot tasks. Updated project version to
1.5.75 for this update.
Improved the URL normalization logic to handle comma-separated URLs
passed as a single string. Updated version numbers in pyproject.toml
and uv.lock files to reflect the latest changes.
Updated email_tools to auto-detect available email backends (AgentMail or SMTP) based on environment variables. This refactor simplifies usage by providing generic tools while maintaining backend-specific functionalities. Enhanced documentation to reflect these changes and improve usability.
Enhanced BotConfig and related classes to support multiple operation modes (poll, ws, webhook, hybrid) and configurable webhook port. Updated documentation and validation for new parameters in the AgentMailBot for improved flexibility in message handling. Bumped version to 1.5.71.
feat(email_tools): add reply_email and create_inbox functions
Implemented reply_email for responding to emails and create_inbox for
creating new email inboxes in the AgentMail system. Updated integration
in the tool mappings and profiles to include new functionalities.
Enhanced tests to cover the new features.
```
Added an allowlist for MCP server commands to improve security by
rejecting disallowed and dangerous commands in the MCPHandler class.
Updated tests to verify the new validation logic and ensure expected
executables are accepted. Bumped version to 1.5.69.
feat(email): add AgentMail tools for sending and managing emails
- Introduced send_email, list_emails, and read_email functions.
- Added email_tools module for agent interaction.
- Updated tool mappings to include email functionalities.
- Included example YAML configuration for an AgentMail bot.
- Enhanced tests for email tools and added new test cases.
```
feat(bots): add email bot examples and functionalities
This commit introduces a new email bot feature, enabling agents to
interact through email via IMAP/SMTP. It includes example usage,
custom configurations, and a multi-platform approach, enhancing the
bot's usability in diverse environments.
```
docs(readme): refine performance section and enhance descriptions
Updated the performance metrics and descriptions to clarify advantages of PraisonAI. Improved consistency in terminology for better readability.
```
feat(bots): add EmailBot for IMAP polling and SMTP sending
This commit introduces the EmailBot, enabling integration with email
services using IMAP for receiving messages and SMTP for sending.
Updates include new environment variables for configuration,
enhancements to the bot registry, and modifications to schema and
initialization logic for seamless integration.
```
fix(agent): handle potential None value for agent name
Updated agent hash generation to default to "agent" when name is None.
Bumped version to 1.5.63 to reflect this change.
```
feat(tests): add deep performance profiling integration test
Introduced a new integration test to run cProfile-wrapped Agent prompts.
This test stores detailed function-level breakdown as JSONL for regression
tracking and comparison of performance over time. Updated version number
and modified documentation accordingly.
```
feat(llm): add support for OpenAI Responses API
- Implemented methods to check model compatibility with the Responses API.
- Added functionality to transform Chat Completions messages to Responses API parameters.
- Updated agent and budgeter context for new model types and limits.
- Cleaned up test cases for database integration to remove unnecessary parameters.
```
Added a guideline in the system prompt to explain actions before tool calls, enhancing clarity and transparency in interactions. Updated version to 1.5.58 to reflect changes.
Added a `_doom_recovery_active` flag to manage agent behavior during
doom loops. This prevents normal termination signals when a doom loop
is detected, allowing the system to handle recovery more effectively.
Updated relevant sections in `agent.py` and adjusted unit tests to
reflect changes. Bumped version to 1.5.56.
Improved handling of agent's chat responses, including better
doom loop detection. Added intermediate narrative emission for LLM
tool calls, enhancing transparency in execution logic.
Updated tests to cover new functionality.
This test evaluates the functionality of the tool_completion fix
with a detailed multi-tool prompt. It includes tasks such as
web searching, file creation, execution, and reporting.
- Added completion callback for tool-call completion if the model used tools and produced a substantive response.
- Updated `execute_tool` and `_execute_tool_with_context` methods to include `tool_call_id` for better event correlation.
- Improved logging for tool execution within the agent's framework.
Introduced `store_learning` and `search_learning` functions to
facilitate categorized storage and retrieval of user insights and
preferences. Enhanced agent interaction by allowing agents to
remember and recollect user behaviors across sessions. Updated
agent state to include a learn manager for integration with the
learning system.
- Introduced optional bearer token for POST /a2a requests
- Added serve method for standalone A2A server using FastAPI
- Updated router to enforce authentication when token is set
- Enhanced message parsing to support additional part types
Added detailed usage examples for single, multi agents, MCP, custom tools, and persistence. Included a quick reference for CLI commands to improve user onboarding. Removed outdated sections for clarity.
Updated the "Why PraisonAI?" section for clarity and conciseness,
retaining key features while enabling easier navigation with an
expandable details section to view all features.
Modified logo dimensions and enhanced the documentation layout by
refactoring sections related to quick start instructions and added
details on supported LLM providers. Overall goal was to improve
readability and user experience.
Updated README.md to reflect changes in logo paths, added new features,
and improved contribution guidelines. Added 24 new provider icons to
public directory for better integration visibility.
Revised feature names for clarity and consistency, changing "Dashboard UI" to "AgentClaw." Added a new section outlining various use cases for AI agents across multiple industries. Updated links and formatting for better readability.
Updated Dockerfiles and project files to use praisonai version 4.5.43
and praisonaiagents version 1.5.43 for improved functionality and
features. Added new 'claw' command in the CLI for enhanced user
experience.
Updated the project description to highlight key features and capabilities, including automation, supported platforms, and other enhancements for better understanding.
Revised multiple links in the README to point to the correct documentation
pages, specifically changing references from features to concepts to enhance
user navigation and comprehension.
Added a new entry for the Dashboard UI in the README and updated
the version of `praisonaiagents` to 1.5.41 in the relevant files.
This reflects recent changes and improvements in UI capabilities.
Updated README.md to highlight new bot functionalities including Telegram,
Discord, Slack, and WhatsApp integration. Increased version to 1.5.40
in `pyproject.toml` for `praisonaiagents`. Expanded dependencies for
claw in the main `pyproject.toml`. Enhanced .gitignore to include
build files.
Replaced outdated links in the README file with new feature documentation
links to ensure users have access to the latest information about the
project's capabilities.
Added several new features to the README.md including Sessions + Auto-Save, Telemetry, Policy Engine, Thinking Budgets, Background Tasks, Doom Loop Detection, Graph Memory, RAG + Quality-Based RAG, and Sandbox Execution.
Enhanced the features section with specific feature descriptions and
usage examples to provide clearer insights into the framework's
capabilities and benefits for new users.
The README.md has been significantly updated with a focus on clear
guidance and reduced verbosity. Many sections were condensed or
removed, resulting in a net decrease in lines while enhancing
navigation and support links for users.
Added an optional session_id parameter to DeliveryTarget and scheduling
functions to preserve conversation context during job execution. This
enhancement allows agents to access prior chat history and improves
overall task management flexibility. Updated relevant documentation and
CLI commands accordingly.
Added a MongoDB backend for storage, which allows document-oriented
data storage. Implemented protocol-compliant aliases for memory operations
to improve consistency. Updated related memory management logic to support
new functionality, enhancing overall performance and user experience.
Updated various parts of the codebase to centralize directory paths
using the new `paths.py` utility. This improves maintainability and
consistency across the project when accessing directory paths for
plugins, snapshots, memory, and configuration.
Added integration and unit tests to ensure correct behavior of path
configurations.
MODEL_WINDOWS had two entries for gpt-4o-mini and none for gpt-4o.
The first entry was clearly intended to be gpt-4o based on context.
This meant gpt-4o users got no context window match, potentially
causing suboptimal chunking or fallback behavior.
Signed-off-by: JiangNan <[email protected]>
When an agent is created with instructions but no explicit name, and
memory history is enabled, name can be None. Calling .encode() on None
raises AttributeError. Fall back to "agent" when name is None.
Signed-off-by: JiangNan <[email protected]>
- Implement lazy loading for WebSocketGateway and GatewaySession in the
gateway module, allowing easier access without needing wrapper imports.
- Enhance SessionData to include gateway session ID and agent ID.
- Introduce methods in DefaultSessionStore for querying sessions by agent
and linking sessions to gateway sessions.
Introduced new YAML workflow examples demonstrating agent-centric steps
and hybrid workflows. The agent-centric job workflow supports roles
like Technical Writer and includes quality checks, while the hybrid
workflow combines deterministic steps with multi-agent coordination.
Updated version to 1.5.26 for the praisonai-agents package.
Added examples for file-based actions (line count and system info)
and YAML-defined actions in new workflow files. Updated relevant
files to support these actions, enhancing the capabilities for
custom workflows. Updated package version to 1.5.25.
run_skill_script executes arbitrary .py/.sh/.js scripts via subprocess.run
without any approval gate. Add @require_approval(risk_level='critical') to
both the class method and module-level wrapper, matching the pattern used
by shell_tools and python_tools.
- Discord: test DISCORD_CHANNEL_ID env fallback, SSL verify default/override
- Telegram: test TELEGRAM_CHAT_ID env fallback, SSL verify default/override
- Webhook: test integer status does not crash str().lower()
Create multiple TODOs and sub-TODOs, get all things done.
First: detailed analysis, plan, and gap analysis. Go through all files, understand current logic. Search if needed.
Then: implement, fix, test (TDD, Agent-Centric, no perf impact, DRY). praisonaiagents is protocol-driven. Run unit, integration, smoke, and real agentic tests.
After: re-do detailed analysis/plan to find remaining gaps and propose fixes.
You are an expert AI engineer in the PraisonAI ecosystem.
Production-quality code, zero regressions, full verification. Make PraisonAI the best agent framework.
### Core Philosophy
```
Simpler • More extensible • Faster • Agent-centric
MANDATORY: Before writing any code, you MUST carefully read "src/praisonai-agents/AGENTS.md" to understand this repository's extremely specific Architecture, Protocol-First design rules, and Agent-Centric Philosophy.
Before implementing anything, answer these questions:
- CORE vs WRAPPER vs TOOLS ROUTING:
1. Core SDK (praisonaiagents/): Only core protocols, base classes, decorators. No heavy implementations.
2. Wrapper (praisonai/): CLI, heavy implementations, optional dependencies.
3. Tools (PraisonAI-Tools): Specific integrations, external tools (e.g. SurrealDB, Slack), and community extensions MUST go to the `MervinPraison/PraisonAI-Tools` repository. If the feature is a tool, clone `https://github.com/MervinPraison/PraisonAI-Tools`, implement it there, and create the PR using `gh pr create -R MervinPraison/PraisonAI-Tools`.
- Does it duplicate existing functionality? Check if Agent already supports this via existing params (reflection, planning, tools, hooks, memory).
- Does it inherit from Agent properly? New agent types MUST inherit Agent, not wrap it with composition.
- Does it add new dependencies? Only optional deps allowed, must be lazy-imported.
- Will agent.py grow larger? If the change adds >50 lines to agent.py, find a way to extract instead.
- Is there a name collision with existing exports in __init__.py?
If ANY of these conceptual checks fail (excluding routing), add a comment to the issue explaining why and close it. Do NOT create a PR.
STEP 3 — IMPLEMENT:
- Create a new git branch appropriately named (e.g. \`feature/issue-<number>\`)
- Follow protocol-driven design: protocols in core SDK, heavy implementations in wrapper
goal:"Read the GitHub issue, understand the required changes, and map the problem to the local codebase"
backstory:"You are an expert software analyst who reads bug reports and feature requests. You excel at taking a problem description and finding exactly which files in the codebase need to be modified. Your primary job is discovery and planning."
tools:
- "execute_command"
software_engineer:
role:"Autonomous Software Engineer"
goal:"Implement required code changes on a branch, run tests, commit, and push"
backstory:"You are a senior software engineer. You always branch first, implement changes using shell commands, verify with git diff, run tests, then commit and push. You never create a Pull Request unless the issue body explicitly requests one."
tools:
- "execute_command"
- "github_create_branch"
- "github_commit_and_push"
- "github_create_pull_request"
steps:
- name:Analyze Issue
agent:issue_analyst
action:>
Thoroughly analyze the issue and the repository. Follow these steps in order.
First, set up git identity: execute_command 'git config user.name PraisonAI' then
execute_command 'git config user.email [email protected]'. Do NOT pass cwd.
Second, read the issue: execute_command 'cat .github/triage-context.md'. Do NOT pass cwd.
goal:"Identify security vulnerabilities, authentication issues, input validation problems, and unsafe code practices in the PR changes"
backstory:"You are a cybersecurity expert specializing in code analysis. You have extensive experience in identifying common security flaws like injection attacks, authentication bypasses, exposed secrets, and unsafe data handling patterns."
tools:
- "execute_command"
performance_reviewer:
role:"Performance Code Reviewer"
goal:"Analyze code changes for performance implications, identify bottlenecks, inefficient algorithms, and resource usage issues"
backstory:"You are a performance optimization specialist with deep knowledge of algorithm efficiency, memory management, and system performance. You excel at spotting code that could cause performance degradation."
tools:
- "execute_command"
maintainability_reviewer:
role:"Code Quality & Maintainability Reviewer"
goal:"Evaluate code structure, readability, documentation, naming conventions, and adherence to best practices"
backstory:"You are a software engineering expert focused on code quality and maintainability. You ensure code follows established patterns, is well-documented, and will be easy for future developers to understand and modify."
tools:
- "execute_command"
lead_reviewer:
role:"Lead Technical Reviewer"
goal:"Synthesize all review feedback, make final recommendations, and post comprehensive review comments to the GitHub PR"
backstory:"You are a senior technical lead responsible for final review decisions. You coordinate input from security, performance, and maintainability reviewers to provide balanced, actionable feedback to the development team."
tools:
- "execute_command"
steps:
- name:security_analysis
agent:security_reviewer
action:|
Analyze the PR diff for security issues:
1. Extract PR details: `echo "$PR_DATA"`
2. Get changed files: `echo "$CHANGED_FILES"`
3. Review full diff: `gh pr diff ${PR_NUMBER}`
4. Look for:
- Hardcoded secrets, API keys, passwords
- SQL injection vulnerabilities
- XSS vulnerabilities
- Authentication/authorization bypasses
- Unsafe file operations
- Command injection risks
- Missing input validation
- Exposed sensitive data
5. Document findings with file paths and line numbers
expected_output:"Detailed security analysis report with specific vulnerabilities found, severity levels, and remediation suggestions"
- name:performance_analysis
agent:performance_reviewer
action:|
Analyze the PR diff for performance issues:
1. Review algorithm complexity changes
2. Check for inefficient database queries
3. Identify memory leaks or excessive allocations
4. Look for hot-path regressions
5. Check for blocking I/O operations
6. Analyze module-level imports that could slow startup
7. Review caching implementations
8. Check for recursive operations without termination
9. Document performance concerns with impact estimates
expected_output:"Performance analysis report highlighting bottlenecks, efficiency concerns, and optimization recommendations"
- name:maintainability_analysis
agent:maintainability_reviewer
action:|
Analyze the PR diff for code quality and maintainability:
1. Check naming conventions consistency
2. Evaluate code structure and organization
3. Review documentation completeness
4. Check for DRY violations
5. Analyze error handling patterns
6. Review test coverage for changes
7. Check adherence to repository coding standards
8. Evaluate API design consistency
9. Look for technical debt introduction
expected_output:"Code quality analysis with specific recommendations for improving maintainability and readability"
- name:final_review
agent:lead_reviewer
action:|
Synthesize all reviews and post final comprehensive feedback:
1. Collect input from security, performance, and maintainability reviews
2. Prioritize findings by severity (Critical, High, Medium, Low)
3. Create structured review comment using this format:
## 📋 Review Summary
[2-3 sentence overview and assessment]
## 🔍 General Feedback
[Overall patterns and observations]
## 🎯 Specific Feedback
### 🔴 Critical (if any)
[Security vulnerabilities, breaking changes, major bugs]
console.log('Issue already has claude label, skipping');
return;
}
// Add label to trigger claude.yml via issues:labeled event
await github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '@claude review this issue and do a detailed analysis and fix this if the existing code doesn\'t have the solution implemented. Making sure it has backward compatibility, no existing features removed. After making those changes, again review the applied changes. Use @web to search if you dont know any information or to find the latest documentation or to find the latest version. Run the code if you think you need to run it to test it. Minimal code change to start with if required any changes. MAINLY IT SHOULD NOT IMPACT ON THE CURRENT SPEED OF EXECUTION of existing features, not increasing the overhead. **Please create a PR using gh tool with your changes**.'
})
labels: ['claude']
});
// Also post instructions as a comment for context
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '🤖 Auto-triaging with Claude. Analyzing issue and implementing a fix...\n\nClaude will:\n1. Classify this issue\n2. Search codebase for root cause\n3. Implement a minimal fix following AGENTS.md\n4. Create a PR with the changes'
body: '@claude review this pull request and do a detailed analysis and fix this if the existing code doesn\'t have the solution implemented. Making sure it has backward compatibility, no existing features removed. After making those changes, again review the applied changes. Use @web to search if you dont know any information or to find the latest documentation or to find the latest version. Run the code if you think you need to run it to test it. Minimal code change to start with if required any changes. MAINLY IT SHOULD NOT IMPACT ON THE CURRENT SPEED OF EXECUTION of existing features, not increasing the overhead.'
})
body: '@copilot Do a thorough review of this PR. Read ALL existing reviewer comments above from Qodo, Coderabbit, and Gemini first — incorporate their findings.\n\nReview areas:\n1. **Bloat check**: Are changes minimal and focused? Any unnecessary code or scope creep?\n2. **Security**: Any hardcoded secrets, unsafe eval/exec, missing input validation?\n3. **Performance**: Any module-level heavy imports? Hot-path regressions?\n4. **Tests**: Are tests included? Do they cover the changes adequately?\n5. **Backward compat**: Any public API changes without deprecation?\n6. **Code quality**: DRY violations, naming conventions, error handling?\n7. **Address reviewer feedback**: If Qodo, Coderabbit, or Gemini flagged valid issues, include them in your review\n8. Suggest specific improvements with code examples where possible'
body: '@copilot Do a thorough review of this PR. Read ALL existing reviewer comments above first.\n\nReview areas:\n1. **Bloat check**: Are changes minimal and focused?\n2. **Security**: Any hardcoded secrets, unsafe eval/exec, missing input validation?\n3. **Performance**: Any module-level heavy imports? Hot-path regressions?\n4. **Tests**: Are tests included? Do they cover the changes adequately?\n5. **Backward compat**: Any public API changes without deprecation?\n6. **Code quality**: DRY violations, naming conventions, error handling?\n7. Suggest specific improvements with code examples where possible'
body: '@claude You are the FINAL architecture reviewer. Read ALL comments above from Gemini, Qodo, CodeRabbit, and Copilot carefully before responding.\n\n**Phase 1: Review per AGENTS.md**\n1. Protocol-driven: check heavy implementations vs core SDK\n2. Backward compatible: ensure zero feature regressions\n3. Performance: no hot-path regressions\n\n**Phase 2: FIX Valid Issues**\n4. For any VALID bugs or architectural flaws found by Gemini, CodeRabbit, Qodo, Copilot, or any other reviewer: implement the fix\n5. Push all code fixes directly to THIS branch (do NOT create a new PR)\n6. Comment a summary of exact files modified and what you skipped\n\n**Phase 3: Final Verdict**\n7. If all issues are resolved, approve the PR / close the Issue\n8. If blocking issues remain, request changes / leave clear action items'
body: '@claude You are the FINAL architecture reviewer. Read ALL comments above from Gemini, Qodo, CodeRabbit, and Copilot carefully before responding.\n\n**Phase 1: Review per AGENTS.md**\n1. Protocol-driven: check heavy implementations vs core SDK\n2. Backward compatible: ensure zero feature regressions\n3. Performance: no hot-path regressions\n\n**Phase 2: FIX Valid Issues**\n4. For any VALID bugs or architectural flaws found by Gemini, CodeRabbit, Qodo, Copilot, or any other reviewer: implement the fix\n5. Push all code fixes directly to THIS branch (do NOT create a new PR)\n6. Comment a summary of exact files modified and what you skipped\n\n**Phase 3: Final Verdict**\n7. If all issues are resolved, approve the PR / close the Issue\n8. If blocking issues remain, request changes / leave clear action items'
body: '@claude You are the Lead Engineer. Read ALL analysis and reviews above carefully (Gemini, CodeRabbit, Qodo, Copilot, etc).\n\n**Phase 1: Review per AGENTS.md**\n1. Protocol-driven: check heavy implementations vs core SDK\n2. Backward compatible: ensure zero feature regressions\n3. Performance: no hot-path regressions\n\n**Phase 2: FIX Valid Issues**\n4. For any VALID bugs or architectural flaws found by Gemini, CodeRabbit, Qodo, Copilot, or any other reviewer: implement the fix\n5. Push all code fixes directly to THIS branch (do NOT create a new PR)\n6. Comment a summary of exact files modified and what you skipped\n\n**Phase 3: Final Verdict**\n7. If all issues are resolved, approve the PR / close the Issue\n8. If blocking issues remain, request changes / leave clear action items'
${{ steps.check_fork.outputs.is_fork == 'true' && 'CRITICAL: THIS IS A PULL REQUEST FROM A FORK. YOU DO NOT HAVE PUSH PERMISSIONS TO THIS REPOSITORY. ONLY READ FILES, VALIDATE CODE, AND PROVIDE YOUR COMMENTS/FEEDBACK DIRECTLY IN THIS PR VIA COMMENTS. DO NOT ATTEMPT TO PUSH OR CREATE PULL REQUESTS.\n\n' || '' }}
You are working on the PraisonAI SDK. Follow AGENTS.md strictly.
STEP 0 — SETUP GIT IDENTITY & AUTH (GLOBAL — required for all repos):
When work must happen in a different repository, follow these steps EXACTLY. Do NOT attempt to use `cd`, as directory state is not preserved. Use `git -C` for all commands.
- For SDK changes: cd src/praisonai-agents && PYTHONPATH=. python -m pytest tests/ -x -q --timeout=30
- For docs changes: verify files exist and are valid markdown/MDX
- Ensure no regressions
STEP 5 — CREATE PR:
- Commit with descriptive message, push, and create PR using `gh pr create`
- For external repos, use `gh pr create -R MervinPraison/<REPO_NAME>`
CRITICAL: You MUST create the PR automatically using `gh pr create`. Do NOT just provide a link or say "manual push required".
NOTE: If you worked on an external repo, the wrapper action will report "No commits" for the main repo at the end. This is expected, do not worry about it.
const reviewText = '@claude review if the changes made in the above branch are as per the requirements and make changes to the above branch if issues still exist.';
let comments = [];
let issueNumber;
try {
// Determine issue/PR number based on event type
if (context.eventName === 'pull_request_review_comment' || context.eventName === 'pull_request_review') {
} else if (context.eventName === 'issue_comment' && context.payload.issue.pull_request) {
// This is a comment on a PR (not an issue)
issueNumber = context.payload.issue.number;
isPR = true;
} else {
// This is a regular issue - don't post review comment
issueNumber = context.issue.number;
isPR = false;
}
// Only post review comment on PRs, not regular issues
if (isPR) {
console.log(`Posting review comment on PR #${issueNumber}`);
await github.rest.issues.createComment({
issue_number: issueNumber,
owner: context.repo.owner,
repo: context.repo.repo,
body: '@claude review if the changes made in the above branch are as per the requirements and make changes to the above branch if issues still exist. MAINLY IT SHOULD NOT IMPACT ON THE CURRENT SPEED OF EXECUTION of existing features, not increasing the overhead.'
});
} else {
console.log(`Skipping review comment for regular issue #${issueNumber}`);
You are a helpful GitHub issue assistant. Your task is to analyze and help with GitHub issues.
@@ -103,6 +104,8 @@ jobs:
- Search codebase for related files using `glob`, `search_file_content`, `list_directory`
**STEP 2: If Code Changes Are Needed**
MANDATORY FIRST STEP: Before writing any code, you MUST use `read_file` to carefully read "src/praisonai-agents/AGENTS.md". You must honor this repository's extremely specific Architecture, Protocol-First design rules, and Agent-Centric Philosophy!
MANDATORY FIRST STEP: Before writing any code, you MUST use `read_file` to carefully read "src/praisonai-agents/AGENTS.md". You must honor this repository's extremely specific Architecture, Protocol-First design rules, and Agent-Centric Philosophy!
**IMPORTANT:** DO NOT create a new branch! Work on the EXISTING PR branch.
praisonai "Build a mini calculator - create /tmp/calculator.py with add, subtract, multiply, divide functions, write unit tests in /tmp/test_calculator.py using unittest, run the tests to make sure they pass, then generate a coverage-style report in /tmp/calc_report.md listing which functions were tested and read it back" --trust
praisonai "Create a Python file at /tmp/fibonacci.py that generates the first 20 Fibonacci numbers, run it to verify the output is correct, then write a summary to /tmp/fib_summary.md explaining the algorithm you used and the output, finally read back both files to confirm everything looks good" --trust
# Multi-step research: web search, file creation, code execution, reporting
# Tests: web search, file write, code execution, markdown report, file read, directory listing, system info
praisonai "Research the top 3 Python web frameworks (Django, FastAPI, Flask), then: 1) Search the web for each framework's latest version and key features, 2) Create a file called /tmp/framework_comparison.py that contains a Python dictionary with the comparison data, 3) Execute the code to verify the dictionary is valid, 4) Write a markdown report to /tmp/framework_report.md summarizing your findings in a table format, 5) Read back the report file to verify it was written correctly, 6) List the files in /tmp to confirm both files exist, 7) Get system info to note what OS this report was generated on, 8) Analyze the Python code you wrote for any issues, 9) Format the Python code properly, 10) Finally search for any recent news about Python 3.13 features" --trust
praisonai "Investigate my system - get the current date, check disk usage, find out what Python version is installed, list running processes sorted by memory, then write all findings to /tmp/system_audit.md as a neat report and read it back to verify" --trust
praisonai "Write a todo list app at /tmp/todo.py with functions to add, remove, and list tasks stored in /tmp/todos.json, run the script with some sample tasks added, then create documentation at /tmp/todo_docs.md explaining usage with examples, and verify all three files exist" --trust
praisonai "Search the web for the current weather in Tokyo, create a JSON file at /tmp/weather_data.json with the findings, then write a Python script at /tmp/parse_weather.py that reads the JSON and prints a formatted weather report, execute the script, and list all files you created in /tmp" --trust
Loaded 100 of 880 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.