Route OpenRouter video SKUs (Veo, Kling, Hailuo, Seedance, ...) through the
existing LiteLLM-backed VideoAgent instead of a bespoke provider subsystem.
Adds OpenRouter HTTP-Referer/X-Title attribution headers for openrouter/
models (overridable via OPENROUTER_REFERER/OPENROUTER_APP_TITLE), documents
OpenRouter as a supported provider, and adds an example.
Co-authored-by: Mervin Praison <[email protected]>
* docs(examples): add meeting-notes agent example composed from existing primitives (#4622)
Demonstrates the AI meeting-notes pipeline (transcribe -> summarize ->
index for Q&A) using existing AudioAgent, Agent, and knowledge= RAG.
No new SDK surface added; keeps core lightweight per AGENTS.md.
Co-authored-by: Mervin Praison <[email protected]>
* fix(examples): print final Q&A result in meeting-notes agent
Greptile P1: qa.start() return was discarded so non-interactive/redirected
runs omitted the advertised Q&A output. Now printed explicitly.
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: Mervin Praison <[email protected]>
Make the dormant verification primitive enforceable:
- Wire _verification_gate() into run_autonomous(_async): blocking hook
failures block a success outcome and feed captured stdout/stderr back as
feedback; never-passing checks end at max_iterations, not success.
- Fix lossy _run_verification_hooks re-wrap (preserve details/error/duration).
- Add declarative FileCheckHook (exists/non_empty/contains/json_field==equals),
no shell; CommandVerificationHook now accepts a string command.
- Feed the goal judge executable evidence; a failing blocking hook
short-circuits to continue without spending a judge call.
- add_verification()/remove_verification() for runtime registration.
- Add 'verification' run-journal event kind and YAML `verification:` config
parity mapping command:/file: shapes onto the two hook classes.
Opt-in only: agents without verification_hooks are unchanged.
Co-authored-by: MervinPraison <[email protected]>
Previously MCP("npx -y pkg", args=[...]) passed the whole string as the
executable, so the subprocess spawn silently failed and 0 tools were
discovered. Now the command string is split on whitespace regardless of
whether args are supplied, using the first token as the executable and
prepending the remaining tokens to any explicit args.
Also updates examples/python/mcp/filesystem-mcp.py to use the reliable
executable + args form.
Co-authored-by: MervinPraison <[email protected]>
Adds load_gateway_config integration coverage for the #3050 validation
path and documents load-time gateway block checks in the example.
Supersedes #3060; core fix landed in #3079.
Co-authored-by: botbikamordehai2-sketch <[email protected]>
Close SSRF gap where compare_extraction fetched via newspaper3k and
requests.get without _validate_url, unlike the trafilatura path.
Co-authored-by: Mervin Praison <[email protected]>
_validate_url only inspected IP literals, so a plain domain or an encoded
form (a decimal IP, or "<internal-ip>.nip.io") passed even though it
resolves to an internal address, defeating the SSRF guard. Resolve the
hostname and reject any private, loopback, reserved or link-local address,
matching praisonaiagents/tools/file_tools.py.
The example passed topic via team.start(inputs=...), but AgentTeam.start
swallows **kwargs and never consumes `inputs`; interpolation reads only
task/team `variables` and replaces double-brace {{key}} placeholders.
Switch to AgentTeam(variables=...) with {{topic}} so the example actually
substitutes the topic instead of emitting a literal placeholder.
Co-authored-by: Mervin Praison <[email protected]>
Documents that Task.on_task_complete 2-param callbacks receive
(task_output, metadata) — NOT (task, task_output) like AgentTeam's hook.
Adds a copy-pasteable sequential human-review example and a regression
guard test. No new API surface (lightweight per AGENTS.md).
Co-authored-by: Dhivya-Bharathy <[email protected]>
AgentTeam.__init__ accepts neither verbose= nor **kwargs, so passing
verbose= raised TypeError at construction. Verbosity is controlled via the
consolidated output= param (silent/minimal/verbose) and iteration limits via
execution=. Migrated all internal CLI, template generators, and examples off
the removed verbose=/max_iter=/session= kwargs, and added an AST lint guard
that scans examples + internal CLI for invalid AgentTeam kwargs to prevent
regression.
Co-authored-by: Dhivya-Bharathy <[email protected]>
Remove 13 knowledge.db binaries plus managed_ids.json, blog_post.md,
tutorial.md, token_metrics_export.json, market_research_results.json that
were accidentally committed (PR notes explicitly say not to commit local
artifacts). Add .gitignore rules to prevent recurrence.
Co-authored-by: Mervin Praison <[email protected]>
- Fix AgentTeam.start() result handling across 22+ workflow/usecase examples
- Fix missing AgentFlow/AgentTeam/AutoAgents imports and registry override demo
- Fix scope_identifiers, state_redis db import, and ToolsMCPServer.run_sse API
- Mark STT and stale tool-import examples as skip until refreshed
- Remove stale db mapping that shadowed praisonaiagents.db submodule
Co-authored-by: Cursor <[email protected]>
Wire Typer run/shell/backends to SandboxHandler, implement daytona-sdk
DaytonaSandbox, expand live Docker/manager tests and backward-compat gates,
and refresh praisonai-sandbox and praisonai-agents lockfiles.
Co-authored-by: Cursor <[email protected]>
Move gateway scheduler executor to praisonai_bot with wrapper shims, compose
[claw] from praisonai-bot[gateway,bot], restore onboard CI coverage, and
document the four-tier architecture plus config-kernel substitute for Phase 0.
- ALLOWED_MODELS set prevents arbitrary path injection via model param
- .get() on all response dict accesses with explicit error messages
- Agent/Tool instantiation moved inside __main__ guard to avoid
side effects on import (env var reads, network, PraisonAI init)
* fix: remove dead private methods in core SDK (fixes#2293)
Remove three unreferenced private methods:
- Agent._create_subagent (agent.py)
- LLM._try_parse_tool_call_json (llm.py)
- LLM._prepare_response_logging (llm.py)
Update the two example files that called _create_subagent to build the
subagent inline via the public get_profile API, preserving behaviour.
No public symbol, signature, or runtime behaviour changes.
Co-authored-by: MervinPraison <[email protected]>
* fix: correct 'a explorer' -> 'an explorer' in example fallbacks
Addresses Greptile P2 review feedback on both autonomy example files.
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: MervinPraison <[email protected]>
Document Evolink's OpenAI-compatible endpoint in the sample environment and add a provider example that uses the existing PraisonAI base_url/api_key configuration path. Cover the config wiring with an offline unit test so the integration stays regression-tested without live API calls.
Relocate LLM config example, gateway prototype, and OpenAI compatibility
tests out of the repo root; remove sys.path hack and gate integration tests
behind PRAISONAI_TEST_OPENAI_COMPAT.
* feat: add JIRA Agent watch tools for monitoring issues and projects
- Add jira_tools.py with 4 comprehensive JIRA monitoring tools
- jira_watch_issue: Monitor specific issues for real-time changes
- jira_watch_project: Watch projects for new and updated issues
- jira_get_issue_info: Get detailed issue information
- jira_search_issues: Search using JQL queries
- Support both cloud and server JIRA authentication
- Include comprehensive unit tests and usage example
- Follow protocol-driven architecture with @tool decorator
- Implement lazy imports and proper error handling
Co-authored-by: MervinPraison <[email protected]>
* fix: resolve critical JIRA tools issues - blocking sleep, data loss, injection, mocking
- Replace blocking time.sleep() polling with timestamp-based single-shot checks
- Fix silent comment data loss by tracking comments independently
- Add project key validation to prevent JQL injection attacks
- Fix test mocking to use correct patch target (jira.JIRA)
- Remove unused variables and improve code quality
- Update tests for new non-blocking API
Fixes blocking agent execution and security vulnerabilities identified by reviewers.
Co-authored-by: Mervin Praison <[email protected]>
* fix: resolve critical JIRA tools issues - string timestamp comparison, JQL injection, null safety
- Added _parse_timestamp() helper to properly parse ISO 8601 timestamps into datetime objects
- Added _validate_timestamp() to prevent JQL injection through timestamp parameters
- Fixed all timestamp comparisons to use datetime objects instead of string comparisons
- Added null safety checks for all JIRA API fields (author, creator, reporter)
- Removed unnecessary expand parameter from jira_get_issue_info
- Added comprehensive unit tests for timestamp parsing utilities
Addresses issues identified by Gemini, Greptile, and other reviewers
---------
Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com>
Co-authored-by: MervinPraison <[email protected]>
* feat: add in-flight run control for channel sessions (fixes#1914)
- Add SessionRunControl class with busy feedback and message queuing
- Support for queue/interrupt/steer modes and /stop command
- Integrate InterruptController from core SDK for cancellation
- Add BotSessionManager.chat_with_run_control() method
- Extend BotConfig with busy_mode and busy_ack settings
- Add /stop command handler and help text updates
- Include comprehensive example and test coverage
Resolves silent blocking issue where mid-run messages queue
invisibly with no user feedback or cancellation option.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: MervinPraison <[email protected]>
* fix: resolve critical bugs in run control implementation
- Fix interrupt controller restoration to prevent deletion (issue #1920)
- Fix memory leak in cleanup_stale_sessions with last_activity tracking
- Add config field wiring in TelegramBot for busy_mode support
- Change steer mode fallback to WARNING level for visibility
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: MervinPraison <[email protected]>
Addresses remaining attack surface from security advisories:
GHSA-3qg8-5g3r-79v5 (JWT signing key - CRITICAL):
auth_service.py: PLATFORM_ENV no longer defaults to 'dev' when unset.
When PLATFORM_JWT_SECRET is not set and PLATFORM_ENV is not explicitly
'dev', an ephemeral random secret is auto-generated with a warning.
This prevents production deployments from silently using the well-known
'dev-secret-change-me' key.
GHSA-vg22-4gmj-prxw (unauthenticated eval - CRITICAL):
Replaced all eval() calls in official examples and benchmarks with an
AST-based safe math evaluator that only allows numeric literals and
arithmetic operators. Files fixed:
- examples/python/a2a/a2a-server.py (the primary advisory target)
- examples/mcp/multi_server.py
- examples/python/mcp/mcp-tools-server.py
- examples/python/mcp/mcp-tools-server-sse.py
- examples/mcp_server/custom_tools_server.py
- examples/python/mcp_server_example.py
- examples/python/custom_tools/tools_with_latency.py
- examples/eval/reliability_example.py
- src/praisonai-agents/benchmarks/real_benchmark.py
The character-filter approach (allowlist '0123456789+-*/.()') was
insufficient because () enables attribute access chains. AST-based
evaluation only permits numeric literals and binary/unary arithmetic.
GHSA-hvhp-v2gc-268q and GHSA-9cr9-25q5-8prj (file read/write):
Already fixed in prior commits via _resolve_rule_path() and
_resolve_cwd_yaml_path() containment helpers.
Co-authored-by: ulsreall <[email protected]>
* feat: add Linear integration — agentic control plane with tools + LinearBot + AgentSession webhooks
- Add linear_tools.py with 9 GraphQL tools (search, create, update issues, comments, cycles)
- Add LinearBot adapter with HMAC-SHA256 webhook verification and AgentSession handling
- Add Linear platform to bot registry, CLI commands, and gateway integration
- Support both LINEAR_OAUTH_TOKEN (OAuth) and LINEAR_API_KEY (personal) authentication
- Include example configurations (YAML and Python) for zero-code and programmatic usage
- Follow protocol-driven architecture: tools in core SDK, bot implementation in wrapper
- Zero import-time cost via lazy loading, full BotProtocol compliance
Closes#1612🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: MervinPraison <[email protected]>
* fix: correct four bugs in Linear integration found during review
- _handle_agent_message: replace non-existent get_session() context
manager with correct _session_mgr.chat() call (matches Slack/Telegram
pattern in _session.py)
- _gql_query: fix aiohttp timeout — bare int 30 → ClientTimeout(total=30)
- bot_linear CLI: fix web_provider= → web_search_provider= to match
BotCapabilities dataclass field (same as all other bot commands)
- bot_linear CLI: add `or []` guards for tools/skills/knowledge_sources
to prevent None being passed where list is expected (matches all other
bot commands)
Agent-Logs-Url: https://github.com/MervinPraison/PraisonAI/sessions/645d14d2-c605-41bf-b83a-839209e7e3b9
Co-authored-by: MervinPraison <[email protected]>
* fix: resolve 3 blocking Linear integration bugs
- Fix BotMessage constructor field names (id->message_id, text->content)
- Fix OAuth Bearer token handling in both tools and bot implementations
- Fix send_message signature to match BotProtocol specification
All fixes verified against the original bug reproduction cases.
Co-authored-by: Mervin Praison <[email protected]>
* refactor: relocate Linear tools to praisonai-tools (canonical home)
Linear GraphQL wrappers don't belong in the protocol-first core SDK
(per AGENTS.md §4.1). They duplicated an already-shipped LinearTool in
MervinPraison/PraisonAI-Tools and pulled third-party SaaS HTTP plumbing
into praisonaiagents/tools/.
This commit:
- Removes praisonaiagents/tools/linear_tools.py (the new file)
- Reverts the 9 TOOL_MAPPINGS additions and the 3 lookup-list entries
- Leaves LinearBot in praisonai/bots/linear.py unchanged (correct location:
wrapper-side webhook adapter)
The full Linear tool surface (search/get/create/update/comment/list cycles/
list states/list teams) is being landed in MervinPraison/PraisonAI-Tools#31
with OAuth Bearer support and 36 unit tests. Users get it via:
from praisonai_tools import LinearTool
praisonai-tools is already a runtime dep of praisonai (pyproject.toml:102),
so end-user UX is unchanged.
---------
Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com>
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: praison <[email protected]>
- Fix test_managed_agent_compute_provider_errors to expect DeprecationWarning instead of ValueError
- Add 3-layer skip guards to all 4 runtime example scripts for clean exit without credentials
- Preserve backward compatibility while implementing the HostedAgent/LocalAgent architectural split
Co-authored-by: praisonai-triage-agent[bot] <272766704+praisonai-triage-agent[bot]@users.noreply.github.com>
Co-authored-by: Mervin Praison <[email protected]>
* fix: ManagedAgent(provider=) overload conflates hosted-runtime vs LLM-routing — propose HostedAgent / LocalAgent split (fixes#1549)
- Create new HostedAgent class for hosted runtimes (Anthropic managed infrastructure)
- Create new LocalAgent class for local loops with optional cloud compute
- Update ManagedAgent factory with deprecation warnings for LLM routing overload
- Add proper error handling for compute provider misuse
- Maintain full backward compatibility with all existing imports
- Update examples to demonstrate new clear semantics
- Add comprehensive tests for new backend semantics
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: MervinPraison <[email protected]>
* examples: update managed-agents provider examples to use new HostedAgent/LocalAgent classes
- Create new canonical examples demonstrating HostedAgent vs LocalAgent usage
- Update existing examples to use clear semantic distinctions
- Add runtime_hosted_anthropic.py for true managed runtime usage
- Add runtime_local_*.py examples for local execution with different LLMs
- Update all_providers.py to use LocalAgent with compute backends
- Update local_basic.py to use LocalAgent semantics
- Add comprehensive test suite for backend semantics
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-authored-by: MervinPraison <[email protected]>
* fix: resolve P1 backward compatibility and routing issues
- Fix ManagedAgent compute provider routing: maintain backward compatibility
for e2b/modal/etc by routing to LocalManagedAgent with deprecation warning
instead of ValueError (fixes hard breaking change)
- Fix LocalAgent provider preservation: preserve provider value for LLM routing
to maintain _resolve_model() prefix behavior (ollama/, gemini/)
- Fix spurious deprecation warnings: auto-detected provider=local no longer
triggers warnings for users who never passed provider=
- Remove unused os import from hosted_agent.py
- Improve error messages with provider-specific guidance
- Fix test fragility with exact warning counts and identity checks
Addresses all P1 issues identified by Greptile and CodeRabbit reviewers.
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: MervinPraison <[email protected]>