- Add max_budget and on_budget_exceeded to ExecutionConfig
- Track total cost, tokens, and LLM calls per agent run
- Enforce budget limits with stop/warn/callable actions
- Zero overhead when budget tracking is disabled
- Add BudgetExceededError exception
- Update config serialization to include budget fields
Provides cost control for agent deployments with configurable limits.
* 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 docker/bots/ with own Dockerfile, docker-compose.yml, README
- Remove bot services from main docker-compose.yml
- Add .env.template with bot tokens
- Add README with setup instructions for Slack/Discord/Telegram
- Fix asyncio.run() error by using run_in_executor() for sync agent.chat()
- Add reply_in_thread config option (default: False for inline replies)
- Add thread_threshold for auto-threading long responses (default: 500 chars)
- Add INFO logging for message received/sent flow
- Add 'bot', 'gateway', 'sandbox', 'wizard', 'migrate', 'security', 'persistence' to LEGACY_COMMANDS in legacy.py
- Add same commands to special_commands list in main.py:797 (argparse fix)
- Fix handle_bot_command to parse list args from main.py
- 'praisonai bot slack --token $TOKEN' now works correctly
fcntl is Unix-only; on Windows, skip file locking.
This fixes ModuleNotFoundError: No module named 'fcntl' on Windows.
- Add _HAS_FCNTL flag based on sys.platform
- Update _read_json and _write_json to conditionally use fcntl.flock
- File locking is acceptable to skip for single-process usage
- Fixed _execute_callback_and_display to always trigger callback
(removed incorrect 'if not _using_custom_llm' guard)
- Added tool_call callback to llm.py for LiteLLM path
- Removed duplicate llm_start callback from llm.py method entry
- Reset AI call counter between agent runs
- Both sync LLM paths now show identical output
Verified output for both paths:
▸ AI → thinking...
│ → get_weather(city="Tokyo") → sunny
▸ AI → responding...
Final Output: ...
- Changed 'LLM' to 'AI' for user-friendliness
- Added context: 'thinking' (1st call) / 'responding' (2nd call)
- Tool calls now show inline with result: │ → tool(args) → result
- Fixed openai_client to pass structured params to callbacks
Output now looks like:
▸ AI → thinking...
│ → get_weather(city="Tokyo") → sunny
▸ AI → responding...
Final Output: ...
- Added llm_start callback in openai_client.py while loop
- Each LLM API call now triggers callback for status display
- Removed duplicate callback from agent._chat_completion
Status output now correctly shows:
▸ Calling LLM (gpt-4o-mini)... # 1st: decides to call tool
│ → get_weather(city="Tokyo")
▸ Calling LLM (gpt-4o-mini)... # 2nd: generates response
Final Output: ...
- Added llm_start callback in agent._chat_completion()
- Registered on_llm_start callback in enable_status_output()
- StatusOutput.llm_start() displays '▸ Calling LLM (model)...'
- Works for both LiteLLM and OpenAI client paths
Status output now shows:
▸ Calling LLM (openai/gpt-4o-mini)...
│ → get_weather(city="Tokyo")
Final Output: ...
- Added use_markdown=True parameter to StatusSink
- response() now renders content with rich.markdown.Markdown
- Lazy import for performance, graceful fallback
- Added _has_explicit_output_config flag to track when user sets output=
- Modified agent.start() to skip TTY auto-verbose if user explicitly configured output
- Fixes issue where output='status' was overridden by TTY auto-verbose showing panels
Before: output='status' in TTY showed panels (wrong)
After: output='status' in TTY shows clean inline status (correct)
- Smoke, main, openai-live, and all extended provider jobs now install
praisonai-agents first before praisonai
- Fixes ModuleNotFoundError: No module named 'rich' in CI
- Fix test-optimized.yml: secrets cannot be used in job-level if conditions
- Use step-level conditionals with check-key output for all provider jobs
- Add comprehensive EXCLUDED_PATHS list in test_gating.py
- Add _is_excluded_path() function to prevent false provider detection
- Exclude _pytest_plugins, _meta, conftest, fixtures from provider scanning
- Add unit tests for excluded path detection
- Make openai-live job safe for forks (skips gracefully without key)
- Remove `verbose` parameter from Agents() calls across all examples
- Remove `markdown` parameter from Agent() initialization
- Change `model` to `llm` in observability example
- Remove unused `kind` parameter from obs.span()
- Fix thinking_budget initialization to use property setter instead of constructor
- Add missing `instructions` parameter to routellm_example.py Agent
Core SDK fixes:
- Add local async test runner in conftest.py that works when pytest-asyncio is not installed
- Register 'asyncio' marker to remove PytestUnknownMarkWarning
- Add @requires_wrapper skip decorator for tests that depend on praisonai wrapper
- Add @requires_knowledge skip decorator for tests that need knowledge dependencies
Wrapper CLI fixes:
- Add missing set_output_controller export to cli/output/__init__.py
- Update test_doctor_cli.py to test actual CLI subcommands instead of non-existent options
Result: Core SDK unit tests pass (1181 passed, 21 skipped), wrapper integration tests pass (17 passed)
## Queue Editing
- Added update_input method to QueueScheduler for editing queued runs
- Added update_input method to QueueManager
- Added handler for QueuePanelWidget.EditRequested in TUIApp
- Only queued (not running) items can be edited
## Queue-First Architecture Support
- Queue items can be edited before processing
- EditRequested message already existed in QueuePanelWidget
31 tests passing
## Session History Implementation
- Created SessionStore class for in-memory chat history persistence
- Added chat_history field to QueuedRun model
- Modified queue worker to inject chat_history into Agent
- Updated TUIApp to store user/assistant messages in SessionStore
- Pass chat_history to queue when submitting messages
## How It Works
1. User sends message -> stored in SessionStore
2. Queue submission includes chat_history from SessionStore
3. Worker injects chat_history into Agent.chat_history
4. Agent has full conversation context
5. Response stored back in SessionStore
## Verified
- Agent remembers previous messages in session
- History format correct for LLM (role + content)
- 31 tests passing
- Call _update_sessions_screen() after pushing sessions screen
- Add _update_sessions_screen() method to load sessions from persistence
- Fallback to showing current session if persistence fails
31 tests passing
## Scrollbar Fix (VerticalScroll)
- ChatWidget now inherits from VerticalScroll (not ScrollableContainer)
- Messages mount directly to container (removed inner Vertical)
- scroll_end() called after adding messages and during streaming
- CSS has overflow-y: auto for proper scrollbar display
## Non-Blocking Input (@work decorator)
- Message submission uses run_worker() for background execution
- _process_message_submission decorated with @work
- User can type while agent is processing
- Multiple messages can be queued
## Root Causes Fixed
1. Inner Vertical container had overflow:hidden - removed it
2. Message handler was async blocking - now uses worker pattern
Based on Textual documentation:
- VerticalScroll: container with vertical layout and auto Y scrollbar
- @work decorator: runs coroutine in background without blocking UI
31 tests passing
## Scrollbar Fix
- ChatWidget now inherits from ScrollableContainer
- Scrollbar visible in chat area (like queue panel)
## Session History Fix
- Pass session_id from TUI app to queue submit
- Pass session_id in agent_config
- Worker now passes session_id to Agent constructor
- Agent will now use session history for context
Flow: TUI.session_id → queue.submit() → worker → Agent(session_id=...)
31 tests passing
Fixes:
- Add HelpScreen for F1 key (was missing, caused KeyError)
- Fix Enter key to send message using custom SubmitTextArea class
- Fix Shift+Enter to insert newline properly
- Register HelpScreen in TUIApp.SCREENS
Tests:
- Add TDD test suite for TUI widgets (12 tests)
- Test Enter key submission
- Test Shift+Enter newline
- Test F1 help screen
- Test Ctrl key bindings
All 13 default tools (ACP, LSP, Basic) load correctly.
Queue system tested and working with real API keys.
- Remove ai-sdk-backbone-verification.md (all tasks completed)
- Update package.json version from 1.3.5 to 1.3.6
- Refactor agent classes to use lazy-loaded AI SDK backend via resolveBackend()
- Convert direct createProvider() calls to async getProvider() pattern
- Add provider promise caching to prevent duplicate backend initialization
- Update ContextAgent, EnhancedAgent, ImageAgent, and PromptExpanderAgent classes
- Add AI SDK backend resolution with lazy initialization via getBackend()
- Add embed() method supporting single/batch text embeddings
- Add getBackendSource() to check backend type (ai-sdk/native/custom/legacy)
- Add getModel() to retrieve agent's model string
- Parse model string to extract provider/model ID for backend selection
- Use AI SDK backend for non-OpenAI providers (streaming and non-streaming)
- Export backend resolver an
- Add test for MCP class ImportError when mcp package unavailable
- Add test for SSEMCPClient ImportError when mcp unavailable
- Add test for HTTPStreamMCPClient ImportError when mcp unavailable
- Add test for HTTPStreamMCPClient ImportError when aiohttp unavailable
- Fix unused import lint warnings (remove sys, add noqa for MCP)
These tests verify that actionable error messages with install instructions
are shown when users try to use MCP functionality without the mcp package.
- Add _completion_with_retry() and _acompletion_with_retry() convenience wrappers
- Remove max_retry_delay cap from internal token wait times to ensure correct rate limiting
- Add max_delay cap (300s default) to _parse_retry_delay() to prevent unbounded sleep from API errors
- Improve retry delay regex patterns (non-greedy matching, HTTP Retry-After header)
- Add documentation notes about large token requests exceeding burst capacity
- Enhance RateLimiter class to support tokens_per_minute limiting
- Add acquire_tokens() method for token-based rate limiting
- Add wait_for_retry() methods for handling rate limit delays
- Add _call_with_retry() methods in LLM class for auto-retry on 429 errors
- Parse retry delay from API error responses (e.g., "retryDelay: 58s")
- Add rate_limiter, max_retries, retry_delay settings to LLM class
Closes#1086
Signed-off-by: majiayu000 <[email protected]>
Wrap mcp imports in try/except blocks in mcp.py, mcp_sse.py, and
mcp_http_stream.py. Add MCP_AVAILABLE flag to check availability at runtime.
When MCP class is instantiated without the mcp package installed, raise a
clear ImportError with installation instructions.
Closes#1091
Signed-off-by: majiayu000 <[email protected]>
- Add doctor examples to main README with documentation link
- Sort checks by category in list_available_checks()
- Update registry method call from list_checks() to get_all_checks()
- Remove unused results variable in run_environment_checks()
- Fix f-string formatting in CI integration print statement
- Bump praisonai-ts version from 1.3.0 to 1.3.1
- Add Router class with simplified keyword/pattern-based routing API (5-line usage)
- Export Router, RouterAgent, createRouter, routeConditions from agent module
- Add SimpleRouterConfig and SimpleRouteConfig types for simplified configuration
- Support both Agent and EnhancedAgent types in router (AnyAgent union type)
- Add Router.chat() method for direct routing
- Bump praisonai-ts version from 1.2.0 to 1.2.1
- Refactor BaseTool to use generics for type-safe input/output parameters
- Update ArxivSearchTool and ArxivDownloadTool to extend generic BaseTool with typed params
- Update MCPTool to extend generic BaseTool
- Change tool method from execute() to run() for consistency
- Export ToolResult, ToolValidationError, validateTool, createTool from base module
- Remove Tool interface export
- Fix#1: MemoryConfig Pydantic validation - add _prepare_mem0_config() to strip
PraisonAI-specific reranker fields (enabled, default_rerank) before passing to
mem0, which only accepts provider and config fields
- Fix#2: LLM Reranker 'Chat' object not callable - check if client.chat is
callable, not just if it exists. OpenAI client has chat as namespace object.
Also handle max_completion_tokens vs max_tokens for different model versions.
- Fix#3: Chroma vector store metadata validation - ensure non-empty metadata
dicts by adding placeholder key when metadata is empty or None
- Fix test file issues: add user_id parameter (required by mem0 API), handle
dict return type from knowledge.search, use gpt-4o-mini for reranker test
(gpt-5-nano returns empty responses with max_completion_tokens=10)
- Add praisonaiagents/db/ module that was being ignored by *.db pattern
- Add exception in .gitignore for the db module directory
- This fixes ModuleNotFoundError: No module named 'praisonaiagents.db' in CI
- test_mini_agents_fix.py: Convert module-level sys.exit(1) to pytest.mark.skipif pattern
- test_xai_fix.py: Convert to proper pytest test function with cleanup
These sys.exit() calls at module level caused pytest to crash during test collection
with INTERNALERROR, breaking all CI pipelines.
description:"Claude Code OAuth Token for Claude Pro"
required:false
github_token:
description:"GitHub token for Claude to operate with"
required:false
@@ -212,6 +215,13 @@ runs:
- Documentation updates
- Testing and deployment
CRITICAL INSTRUCTION: If your task involves modifying codebase files to add a feature or fix a bug:
1. ALWAYS create a new git branch appropriately named (e.g. \`feature/issue-<number>\`).
2. 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.
3. Make your necessary code changes honoring the rules in AGENTS.md.
4. Commit your changes and push the branch to the remote repository.
5. Use the GitHub CLI (\`gh pr create --title "..." --body "Fixes #<number>"\`) to open a Pull Request containing your work.
Respond naturally and helpfully to the user's request using the available tools.
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'
})
# Trigger Claude after Gemini finishes on an Issue or PR
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'
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.
if git diff --quiet src/praisonai-ts/FEATURE_PARITY_TRACKER.json src/praisonai-ts/PARITY.md src/praisonai-rust/FEATURE_PARITY_TRACKER.json src/praisonai-rust/PARITY.md 2>/dev/null; then
echo "changes=false" >> $GITHUB_OUTPUT
echo "No changes to parity trackers"
else
echo "changes=true" >> $GITHUB_OUTPUT
echo "Parity trackers have been updated"
git diff src/praisonai-ts/FEATURE_PARITY_TRACKER.json | head -50
This directory contains examples for using PraisonAI with the Agent Client Protocol (ACP).
## What is ACP?
The Agent Client Protocol (ACP) is a standardized JSON-RPC 2.0 protocol that allows code editors and IDEs to communicate with AI coding agents. It enables seamless integration between PraisonAI and editors like:
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
Loaded 100 of 3131 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.